none
VC++2008 ローカライズされ、かつ既定以外の名前空間に所属するユーザコントロールをフォームに貼り付けようとすると MissingManifestResourceException がスローされる RRS feed

  • 質問

  • こんにちは。
    WindowsXP上で
    VisualC++ 2008 Professional Edition SP1 を使用して
    Windows フォームズアプリケーションを作成しております。

    ユーザコントロールの使い方でわからないことがあり質問させていただきます。
    長くなり恐縮ですが、以下の手順を行います。

    C++ のWindowsフォームズアプリケーションプロジェクト Test1 を作成します。
    メインフォーム Form1 が生成されます。
    ユーザコントロール MyControl1 を追加し、何かボタンなどを貼り付けておきます。

    Form1 , MyControl1 双方とも Localizable プロパティを True に設定します。
    双方とも、Language プロパティの "(既定)" では英語キャプションを設定し、
    同プロパティを "日本語" に変えて日本語キャプションを設定します。

    この時点で、リソースファイル
    Form1.resx
    Form1.ja.resx
    MyControl1.resx
    MyControl1.ja.resx
    が自動的に生成されています。

    既定の名前空間 Test1 の中に、名前空間 SubSpace1 を宣言して、
    Form1 と MyControl1 をその中のクラスにします。

    Form1.h 内の構造
    namespace Test1 {
        namespace SubSpace1 {
            public ref class Form1 {
    ・・・
            };
        } // namespace SubSpace1
    } // namespace Test1

    MyControl1.h 内の構造
    namespace Test1 {
        namespace SubSpace1 {
            public ref class MyControl1 {
    ・・・
            };
        } // namespace SubSpace1
    } // namespace Test1

    この状態で、 Form1 のデザイン画面で MyControl1 を貼り付けようとすると、
    エラーメッセージが表示されてしまいます。

    ---------------------------------
    コンポーネント 'MyControl1' を生成できませんでした。エラーメッセージ :
    System.Resources.MissingManifestResourceException: 指定されたカルチャまたはニュートラル カルチャに対して適切なリソースが見つかりませんでした。"Test1.SubSpace1.MyControl1.resources" が適切に埋め込まれたか、実行時にアセンブリ "Test1" にリンクされたか、または必要なサテライト アセンブリが読み込まれて完全に署名されていることを確認してください。
    ---------------------------------

    このメッセージを出なくして、 Form1 上に MyControl1 を貼り付けられるようにするためには
    どうしたらよろしいでしょうか。
    何かビルド時に追加のアクションを設定する必要がありますでしょうか。

    ちなみに、名前空間を既定(Test1)のままにしておけば、このエラーは出ません。
    ローカライズを行わなかった場合もエラーにはなりません。

    また、VisualC# で同じことをした場合、エラーは出ずに正常に貼り付け操作を行えます。

    お手数をおかけして申し訳ありませんが、
    どうかご教示ください。よろしくお願いいたします。
    2009年10月27日 6:56

回答

  • クラスとリソースで名前空間が違うため、不整合により
    System.Resources.MissingManifestResourceException が発生しているようです。
    よって以下の手順により不整合を解消し、コントロールの貼り付けができるようになりました。 

    1. まずソリューションエクスプローラで「全てのファイルを表示」をON
    2.Form1.resx と MyControl1.resx に対し ソリューションエクスプローラで右クリック→ プロパティを表示
    3.構成プロパティ→マネージリソース→全般と展開
    4.リソースファイル名が各々

    $(IntDir)\$(RootNamespace).$(InputName).resources

    になっているのを、以下に変える。

    $(IntDir)\$(RootNamespace).SubSpace1.$(InputName).resources

    5.リビルドしたら、ユーザーコントロールを貼り付けられるようになりました。


    ただし貼り付けたら、またビルドエラーが発生するので

    1.Form1.h で MyControl1.h をインクルードする。
    2.Test1.cpp では Test1::SubSpace1 を using する。

    でプログラムも実行できました。

    以下を参考にさせてもらいました。
    http://support.microsoft.com/kb/318603/ja

    2009年10月27日 15:59
    モデレータ

すべての返信

  • 挙動からすると、Visual C++ のバグの可能性があります。
    実際に生成されたアセンブリを見ると、既定の名前空間としてリソースがコンパイルされているので、コードとリソースの名前が合致しません。

    不具合の回避策があるかどうかは探せていません。
    (もしかしたら、ないかもしれませんので、その場合は、名前空間を変えるのを諦めるぐらいでしょうか)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月27日 14:46
    モデレータ
  • クラスとリソースで名前空間が違うため、不整合により
    System.Resources.MissingManifestResourceException が発生しているようです。
    よって以下の手順により不整合を解消し、コントロールの貼り付けができるようになりました。 

    1. まずソリューションエクスプローラで「全てのファイルを表示」をON
    2.Form1.resx と MyControl1.resx に対し ソリューションエクスプローラで右クリック→ プロパティを表示
    3.構成プロパティ→マネージリソース→全般と展開
    4.リソースファイル名が各々

    $(IntDir)\$(RootNamespace).$(InputName).resources

    になっているのを、以下に変える。

    $(IntDir)\$(RootNamespace).SubSpace1.$(InputName).resources

    5.リビルドしたら、ユーザーコントロールを貼り付けられるようになりました。


    ただし貼り付けたら、またビルドエラーが発生するので

    1.Form1.h で MyControl1.h をインクルードする。
    2.Test1.cpp では Test1::SubSpace1 を using する。

    でプログラムも実行できました。

    以下を参考にさせてもらいました。
    http://support.microsoft.com/kb/318603/ja

    2009年10月27日 15:59
    モデレータ
  • 以下に変える。
    $(IntDir)\$(RootNamespace).SubSpace1.$(InputName).resources
    なるほど。ファイルのプロパティ部分にありましたか。
    そうだとすると、仕様になりそうだけど、使いにくい感も残りますね。


    コンパイラの事情と、リソースジェネレータの事情で中途半端な状態だろうということが予想されるので、開発チームの事情とユーザの操作性との間で良い落としどころが提案できるかどうかかなぁ。
    現時点で具体案は持っていないので何ともできませんが…。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月27日 16:29
    モデレータ
  • Azuleanさん
    ひらぽんさん

    ご回答くださりありがとうございました。

    ひらぽんさんの示してくださった方法で貼り付け操作が行えました。
    いったんVisualStudioを終了して、プロジェクトの中間フォルダと出力フォルダを削除してから
    再度VisualStudioを起動、リビルドを行ったところうまくいきました。

    大変助かりました。
    どうもありがとうございました。
    2009年10月27日 20:47