VS2010编译C++/CLR .NET Framework3.5仍依赖4.0及C4945警告问题咨询
解决C++/CLR .NET 3.5项目依赖.NET 4.0及C4945警告问题
我之前在VS2010里搞C++/CLR项目对接.NET 3.5时也碰到过一模一样的问题,给你整理几个能解决的步骤:
先搞定C4945的Action符号冲突警告
这个警告完全是因为项目同时拉了.NET 4.0版本的mscorlib.dll和.NET 3.5的System.Core.dll,导致System::Action被重复导入了。你可以这么修:
- 打开项目属性页,到配置属性 -> C/C++ -> 常规,检查「附加包含目录」,把里面不小心加的.NET 4.0路径(比如
c:\windows\microsoft.net\framework\v4.0.30319\)删掉。 - 再去配置属性 -> 链接器 -> 输入,看「附加依赖项」,确保只留.NET 3.5的程序集引用,把.NET 4.0的
mscorlib.dll移除。 - 代码层面也可以加个限定,避免歧义:
// 显式指定使用System.Core里的定义 #using <System.Core.dll> as_friend // 或者使用时明确命名空间 System::Action^ myAction = gcnew System::Action(/* 你的方法 */);
彻底移除项目对.NET 4.0的依赖
VS2010默认有点“偷懒”,哪怕你选了.NET 3.5,某些设置还是会偷偷指向.NET 4.0,得手动改:
- 项目属性配置属性 -> 常规里,把「公共语言运行时支持」严格设为
.NET Framework 3.5,别选任何带v4.0的选项。 - 到配置属性 -> C/C++ -> 所有选项,搜「clr」,确认
/clr参数后面跟的是:v2.0.50727(这是.NET 3.5对应的CLR版本),不是:v4.0。 - 把项目的输出目录和中间目录全清了,再重新生成——旧的编译缓存经常会留着.NET 4.0的引用,清干净就好了。
- 检查你引用的第三方库,要是有依赖.NET 4.0的,必须换成.NET 3.5兼容的版本,不然前面的操作全白搭。
最后验证一下
编译完之后,用ildasm.exe打开你的DLL,看程序集清单,确认所有引用的程序集版本都是2.0.0.0(对应.NET 3.5),而不是4.0.0.0。然后在只装了.NET 3.5的机器上跑一遍,确认不会弹出.NET 4.0缺失的错误。
内容的提问来源于stack exchange,提问作者Dave Gahan




