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

質問
-
こんにちは。
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# で同じことをした場合、エラーは出ずに正常に貼り付け操作を行えます。
お手数をおかけして申し訳ありませんが、
どうかご教示ください。よろしくお願いいたします。
回答
-
クラスとリソースで名前空間が違うため、不整合により
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- 回答としてマーク THUNDERBIRDS66 2009年10月27日 20:47
すべての返信
-
クラスとリソースで名前空間が違うため、不整合により
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- 回答としてマーク THUNDERBIRDS66 2009年10月27日 20:47
-
以下に変える。
なるほど。ファイルのプロパティ部分にありましたか。
$(IntDir)\$(RootNamespace).SubSpace1.$(InputName).resources
そうだとすると、仕様になりそうだけど、使いにくい感も残りますね。
コンパイラの事情と、リソースジェネレータの事情で中途半端な状態だろうということが予想されるので、開発チームの事情とユーザの操作性との間で良い落としどころが提案できるかどうかかなぁ。
現時点で具体案は持っていないので何ともできませんが…。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。