解决C++/CLI中关于“MissingManifestResourceException类型的未经处理的异常出现在mscorlib.dll”问题一例

18 篇文章 0 订阅

声明:本文仅针对下述情况下产生的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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值