静态库模式下的Visual Studio 2010 C++/CLI:找不到程序集"mscorlib.dll"

Ada*_*dam 14 64-bit compiler-errors c++-cli visual-studio-2012

我正在使用动态库(.dll)和x64模式中的VS 2012开发C++/CLI项目.

如果我将模式切换到静态库,我会收到以下错误.

错误1错误C1107:找不到程序集'mscorlib.dll':请使用/ AI指定程序集搜索路径或通过设置LIBPATH环境变量C:\ Depot\Main\Current\Sln\ALibraryProject\Stdafx.cpp 1 1 ALibraryProject

我尝试删除对mscorlib.dll的引用,然后再从以下位置添加它:

项目>属性>常规>公共属性

但这没有帮助.我知道VS处理对.NET程序集的引用,我不想添加磁盘文件引用,因为它似乎不合逻辑!以前有人面对这个吗?

小智 40

将我的解决方案从VS2010编译器转换为VS2013编译器时遇到了同样的问题.

我通过改变项目设置(含管理.cpp文件即是引发此错误的项目)如下解决它:在项目设置| C/C++ | 一般| 额外的#using目录我添加了宏$(FrameworkPathOverride).这解析为您要定位的.NET版本的引用程序集目录,在我的例子中是C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.1


Han*_*ant 5

如果我将模式切换到静态库

这不是您尝试使用/ clr生效的静态库时获得的典型错误.我不得不假设您一直在修改项目设置,以摆脱尝试执行此操作时遇到的难以理解的链接器错误.

核心问题是C++/CLI构建系统不支持包含MSIL的静态库.托管代码不使用链接器,绑定在运行时发生.这使得静态库和DLL之间的本质区别消失了.所以微软决定不支持它,因为实现它没有多大意义.不幸的是,当你尝试这样做的时候,他们并没有大声喊叫,你得到的链接器错误并没有给出足够的暗示你做错了什么.与ILMerge合并的变通方法也不起作用,它无法处理混合模式程序集.合并本机代码部分及其关联的重定位表条目非常不重要.

请记住,链接本机静态库是很好的.典型的C++/CLI项目只有需要使用/ clr生成的ref类包装器才有效.您可以将任何数量的本机代码从库中粘贴到最终的程序集中.


我被迫对实际的编译错误进行理论化,太多的程序员因为与构建静态库没有任何关系的其他原因而得到这个错误,他们在评论中骚扰我.

请注意,针对与您在计算机上安装的.NET版本不同的.NET版本是非常危险的事情,特别是如果您想要定位4.0并且安装了4.5.x..vcxproj文件中的关键元素是<TargetFrameworkVersion>.如果您启动针对旧.NET版本的项目,则必须自行插入.该IDE也不支持改变它,如果它存在,再由手工编辑.

这足以诱使MSBuild生成正确的编译命令.您可以验证是否完全淘汰,查看项目的Debug构建目录的*.tlog子目录.cl.command.1.tlog文件显示传递给编译器的选项.它应该包含:

/ AI"C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0"
/FU"C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll中"

请注意子目录,它非常重要,它与您的目标.NET目标相匹配.本例中为v4.0.并且非常非常重要的是它没有指向c:\ windows\microsoft.net,它是参考程序集的遗留位置.

  • 实际上,我正在纠正你的错误主张. (4认同)
  • downvoted,这不回答OP的问题.有关解决方案,请参阅@ link1305的答案. (3认同)