難読化と多言語化
今まで日本語のみで作成していたC#のプログラムを以下の手順で多言語化し、その後NanDoKuで難読化したところ日本語が出なくなった。
- フォームのデザイン時にLocalizableプロパティをTrueに変更
- まずLanguageプロパティを「(既定値)」にして英語でデザイン
- その後、日本語環境用にLanguageプロパティを「日本語」にしてデザインし直し
- ビルド
※ビルド後にはexeファイルと同じ場所にjaフォルダができており、その中に日本語のリソースがある状態。
日本語環境では日本語で、それ以外では英語で表示されることを期待しているのだが、そうなってくれない。ちなみに、難読化前には、英語版のWindowsでは英語(=既定の言語)で、日本語版のWindowsでは日本語が表示される。jaフォルダを丸ごと削除すると、日本語版Windowsでも英語で表示される。つまり、日本語環境において必要なリソースが見つからない場合は、既定の言語で表示されるようだ。もしかすると、難読化後にもこれと同じこと(難読化によって、日本語のリソースが見つからない状態)が起きているのでは無いかと推測するのだが、「この部分は難読化しない」的な指定をすることで解決できるといいのだけど、どの部分か良くわからん。
試行錯誤1. ***.designer.cs内のコントロール類の変数名が変わったから?
結果的には、これは違った。多言語化した場合、例えばbtnHogeというボタンの初期化は、InitializeComponentで次のように行われる。
this.btnHoge.AccessibleDescription = null; this.btnHoge.AccessibleName = null; resources.ApplyResources(this.btnHoge, "btnHoge"); this.btnHoge.Name = "btnHoge"; this.btnHoge.Click += new System.EventHandler(btnHoge_Click);
ApplyResourcesで、
- 現在のカルチャから判断して適切な言語のリソースをdllから読み込む
- btnHogeのプロパティに値を代入する
をやってくれてるんだと思うけど、この仕組みはたぶん変数名(ここではbtnHoge)に依存しないんじゃないかとおもう。
難読化後には日本語のリソースを読めずに既定の言語のリソースが読まれ、その状態で表示されたってことは、難読化によって変数名が変更されたのが理由じゃなくて、日本語のリソースファイルの内容を読みこめていないということが問題なのだとおもう。
試行錯誤2. 念のためコントロール類の変数名を難読化しないように指定してみた
変数宣言の直前にObfuscationAttribute属性つけても、やっぱり駄目だった。
あきらめた
あ゙ーもう!わからん!
多言語化やめた。泣きながら英語版と日本語版別々にメンテする。