none
ASP.NETサーバーコントロールのリソースをPropertiesフォルダに移すと読めない! RRS feed

  • 質問

  • こんにちは、さとくんパパこと古谷です。お世話になっています。

    ASP.NETサーバーコントロール用のプロジェクトを作成し、ためしに適当なサーバコントロールを作って、プロパティの一部をリソースから読み取ろうとしております。既定のリソースファイルや、拡張子に異なるCulture名を追加したものなど、このプロジェクトのルートに配置していくつかキーと値のペアを入れてみました。

    このサーバコントロールをテストする別のASP.NETアプリを作ってこのコントロールを配置して動作させると、ちゃんとそのBINフォルダ内に当該コントロール用のアセンブリをコピーしてくるだけではなく、ja-JP、en-US等のサブフォルダを作り、自動的にサテライトアセンブリを入れてくれます。で、ちゃんとブラウザの言語の切り替えに応じてリソースを切り替えてくれます。ここまではあっぱれなのですが・・・

    どうもコントロール作成用プロジェクトルートの下にリソースをぽんと置くのが嫌なので、既定のPropertiesフォルダとか自分で作った『Resource』フォルダとかにこれらを移動してみました。すると・・・

    何故かちゃんとWebアプリ側ではサテライトアセンブリが作られているのに、急にリソースの中身が読めなくなってしまい、GetStringsで、以下のようなエラーが出るようになってしまいました。

    指定されたカルチャまたはニュートラル カルチャに対して適切なリソースが見つかりませんでした。"・・・.resources" が適切に埋め込まれたか、実行時にアセンブリ "・・・" にリンクされたか、または必要なサテライト アセンブリが読み込まれて完全に署名されていることを確認してください。

    リソースを元通りルートの下に戻すと大丈夫です。ちゃんとまたリソースを読めるようになります。

    いったいこれは何が原因なのでしょう?出来ればルートではないところに移して管理したいのですが、どうやればよいのでしょうか?

    どなたか分かる方、情報をお寄せくださいませ。
    2009年9月19日 3:50

回答

  • 具体的なディレクトリ構造を書いてみてください。
    ASP.NETサーバーコントロール用のプロジェクトは扱ったことがありませんが、他のプロジェクト形式での経験から言うと、ディレクトリ名はnamespace名の一部に使われます。
    その影響が出ているかもしれません。
    • 回答としてマーク 菊地俊介 2009年10月8日 9:56
    2009年9月19日 5:00
  • どのようなコントロールか不明ですので、ハズレかもしれませんが・・・

    以下のサイトで紹介されているように、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
    2009年9月20日 6:31
  • すみません、質問をよく読んでませんでした。

    .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
    2009年9月23日 2:41

すべての返信

  • 具体的なディレクトリ構造を書いてみてください。
    ASP.NETサーバーコントロール用のプロジェクトは扱ったことがありませんが、他のプロジェクト形式での経験から言うと、ディレクトリ名はnamespace名の一部に使われます。
    その影響が出ているかもしれません。
    • 回答としてマーク 菊地俊介 2009年10月8日 9:56
    2009年9月19日 5:00
  • どのようなコントロールか不明ですので、ハズレかもしれませんが・・・

    以下のサイトで紹介されているように、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
    2009年9月20日 6:31
  • すみません、質問をよく読んでませんでした。

    .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
    2009年9月23日 2:41
  • 皆様、こんにちは。

    佐祐理さん、SurferOnWwwさん、回答ありがとうございます。

    さとくんパパさん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?

    勝手ながら、有用な情報と思われたため佐祐理さん、SurferOnWwwさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    2009年10月8日 9:58