トップ回答者
ASP.NETサーバーコントロールのリソースをPropertiesフォルダに移すと読めない!

質問
-
こんにちは、さとくんパパこと古谷です。お世話になっています。
ASP.NETサーバーコントロール用のプロジェクトを作成し、ためしに適当なサーバコントロールを作って、プロパティの一部をリソースから読み取ろうとしております。既定のリソースファイルや、拡張子に異なるCulture名を追加したものなど、このプロジェクトのルートに配置していくつかキーと値のペアを入れてみました。
このサーバコントロールをテストする別のASP.NETアプリを作ってこのコントロールを配置して動作させると、ちゃんとそのBINフォルダ内に当該コントロール用のアセンブリをコピーしてくるだけではなく、ja-JP、en-US等のサブフォルダを作り、自動的にサテライトアセンブリを入れてくれます。で、ちゃんとブラウザの言語の切り替えに応じてリソースを切り替えてくれます。ここまではあっぱれなのですが・・・
どうもコントロール作成用プロジェクトルートの下にリソースをぽんと置くのが嫌なので、既定のPropertiesフォルダとか自分で作った『Resource』フォルダとかにこれらを移動してみました。すると・・・
何故かちゃんとWebアプリ側ではサテライトアセンブリが作られているのに、急にリソースの中身が読めなくなってしまい、GetStringsで、以下のようなエラーが出るようになってしまいました。
指定されたカルチャまたはニュートラル カルチャに対して適切なリソースが見つかりませんでした。"・・・.resources" が適切に埋め込まれたか、実行時にアセンブリ "・・・" にリンクされたか、または必要なサテライト アセンブリが読み込まれて完全に署名されていることを確認してください。
リソースを元通りルートの下に戻すと大丈夫です。ちゃんとまたリソースを読めるようになります。
いったいこれは何が原因なのでしょう?出来ればルートではないところに移して管理したいのですが、どうやればよいのでしょうか?
どなたか分かる方、情報をお寄せくださいませ。
回答
-
どのようなコントロールか不明ですので、ハズレかもしれませんが・・・
以下のサイトで紹介されているように、Web Resources を利用して .html, .css, image, script ファイル
をカスタムコントロールの Assembly に埋め込むような場合、Working with Web Resources in ASP.NET 2.0
http://support.microsoft.com/kb/910442/en-us例えば Help.htm をルート直下に置くのではなく、ルート直下に Resources というフォルダを配置してその中に入れ
た場合は、コードのすべての場所で SimpleControl.Help.htm ではなくて SimpleControl.Resources.Help.htm
とする必要があります。たぶん、佐祐理さんが指摘されている名前空間の問題と同じことだと思いますが。
#ルート直下に置いたほうが面倒がなさそうですが、何か不都合があるのでしょうか? 単なる趣味の問題ですか?- 回答としてマーク 菊地俊介 2009年10月8日 9:56
-
すみません、質問をよく読んでませんでした。
.html, .css, image, script ファイルの場所ではなくて、.resx ファイルの場所のことだったようですね。その場合も、
やはり名前空間の問題でうまくいかないのだと思います。例えば、ServerControl1 という名前のプロジェクトで、Resource1.resx をルート直下の NewFolder1 というフォル
ダ内に作った場合、ResourceManager のインスタンス生成を以下のようすれば OK なはずです。using ServerControl1.NewFolder1;
・・・中略・・・
ResourceManager rm =
new ResourceManager("ServerControl1.NewFolder1.Resource1", typeof(Resource1).Assembly);または、Resource1.resx を作るときに自動生成される Resource1.Designer.cs の中の「厳密に型指定されたリソ
ースクラス」のプロパティを使うという手もあります。「厳密に型指定されたリソース クラス」には、ResourceManager クラスの GetString メソッドと GetObject メソッ
ドを使用せずにリソースを利用する代替手段が提供されています。その方が間違いがないかもしれません。- 回答としてマーク 菊地俊介 2009年10月8日 9:56
すべての返信
-
どのようなコントロールか不明ですので、ハズレかもしれませんが・・・
以下のサイトで紹介されているように、Web Resources を利用して .html, .css, image, script ファイル
をカスタムコントロールの Assembly に埋め込むような場合、Working with Web Resources in ASP.NET 2.0
http://support.microsoft.com/kb/910442/en-us例えば Help.htm をルート直下に置くのではなく、ルート直下に Resources というフォルダを配置してその中に入れ
た場合は、コードのすべての場所で SimpleControl.Help.htm ではなくて SimpleControl.Resources.Help.htm
とする必要があります。たぶん、佐祐理さんが指摘されている名前空間の問題と同じことだと思いますが。
#ルート直下に置いたほうが面倒がなさそうですが、何か不都合があるのでしょうか? 単なる趣味の問題ですか?- 回答としてマーク 菊地俊介 2009年10月8日 9:56
-
すみません、質問をよく読んでませんでした。
.html, .css, image, script ファイルの場所ではなくて、.resx ファイルの場所のことだったようですね。その場合も、
やはり名前空間の問題でうまくいかないのだと思います。例えば、ServerControl1 という名前のプロジェクトで、Resource1.resx をルート直下の NewFolder1 というフォル
ダ内に作った場合、ResourceManager のインスタンス生成を以下のようすれば OK なはずです。using ServerControl1.NewFolder1;
・・・中略・・・
ResourceManager rm =
new ResourceManager("ServerControl1.NewFolder1.Resource1", typeof(Resource1).Assembly);または、Resource1.resx を作るときに自動生成される Resource1.Designer.cs の中の「厳密に型指定されたリソ
ースクラス」のプロパティを使うという手もあります。「厳密に型指定されたリソース クラス」には、ResourceManager クラスの GetString メソッドと GetObject メソッ
ドを使用せずにリソースを利用する代替手段が提供されています。その方が間違いがないかもしれません。- 回答としてマーク 菊地俊介 2009年10月8日 9:56