声明:本文仅针对下述情况下产生的MissingManifestResourceException异常,标题中已用“一例”进行说明,如果不能解决您的问题,还请多多包涵,实非有意骗取点击量。
环境:
VS2010+SP1
C++/CLI Windows Form Application
注:不确定下述方法是否适用于C++/CLI其它类型的项目。
一、解决C++/CLI的项目名称与namespace(命名空间)不符造成的问题
当创建C++/CLI的Windows Form Application时,其默认的命名空间与项目名称一致。为方便说明,假设项目名称为:Project1。
首先,将Form1的Icon属性指定为其它的ico文件,编译并运行项目,一切正常。
接下来,将Form1.h中的namespace Project1 改成其它的名称,要与项目名称不同,项目可以通过编译,但运行就会报错:
-----错误信息-----
“System.Resources.MissingManifestResourceException”类型的未经处理的异常出现在 mscorlib.dll 中。
其他信息: 未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“xx.resources”正确嵌入或链接到程序集“xx”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
--------------
导致出现错误的原因就是项目默认的命名空间与现行命名空间不同,如果我们能将其改为一致,问题应该可以解决。但VS2010似乎并没有提供图形界面可以进行上述操作,也许有,但我没有找到,所以我采用了手工方法:
找到项目文件(后缀名为.vcxproj),用UltraEdit(其它字处理软件也可以)打开,搜索<RootNamespace>,这个元素的值就是项目默认的命名空间了,它与项目名称一致,虽然我们之前更改了Form1的命名空间,但此处仍是默认的Project1,即是说这个值并不会自动反应我们需要的命名空间,需要手动将它更正,改好后保存、退出。
再次打开项目,编译、运行一切正常。
二、C++/CLI中实现namespace(命名空间)嵌套
使用C#多年,喜欢将项目命名为CompanyNS.FunctionNS,这在C++/CLI中如何实现呢?
可以通过下面的结构实现:
namespace CompanyNS
{
namespace FunctionNS
{
public ref class xx
{
...
}
}
}
使用的时候就可以这样:
CompanyNS::FunctionNS::xx;
网上有朋友把它定义成了宏,用起来很方便,现摘录如下:
#define BEGIN_NAMESPACE namespace CompanyNS { namespace FunctionNS {
#define END_NAMESPACE } }
应用了宏的代码结构如下:
BEGIN_NAMESPACE
public ref class xx
{
...
}
END_NAMESPACE
三、消除C++/CLI中namespace(命名空间)嵌套对项目资源的影响
细心的朋友一定会发现,上面第二点中提到的命名空间嵌套多半会导致第一点中的错误(恭喜您,但没有奖励,就把通过本文解决问题而节省的时间当作奖励吧 :-)),我们一样可以通过修改<RootNamespace>来解决,所不同的是这次要把嵌套的命名空间组合起来,之间用","(逗号)隔开,例如:
<RootNamespace>CompanyNS.FunctionNS</RootNamespace>
仅此而已。
Good luck!