16

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

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

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

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

项目 > 属性 > 常规 > 通用属性

但这没有帮助。我知道 VS 处理对 .NET 程序集的引用,我不想向它添加磁盘文件引用,因为它看起来不合逻辑!以前有人遇到过这种情况吗?

4

5 回答 5

41

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

我通过更改项目设置(对于包含抛出此错误的托管 .cpp 文件的项目)解决了这个问题,如下所示:C/C++ | 一般 | 其他 #using 目录我添加了宏$(FrameworkPathOverride)。这将解析为您所针对的 .NET 版本的参考程序集目录,在我的情况下是 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.1

于 2014-08-28T17:21:34.280 回答
6

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

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

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

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


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

请注意,针对与您在计算机上安装的版本不同的 .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,即引用程序集的旧位置。

于 2013-04-21T20:16:31.567 回答
4

我也有同样的问题。拥有 dll 不起作用,因为我需要为 .net 对象提供本机 C++ 包装器,以便它可以实现 natice c++ 接口 - 我不能在 dll 接口中使用 .net - 这会产生编译错误

这在 VS 2010 中用作静态库(使用 .net 4)

我的一些可执行文件和 dll 也有一些带有 /clr 的代码。他们没有问题。我不是想制作一个网络图书馆。

于 2013-06-18T01:33:43.270 回答
0

我通过删除旧的且未更新的混合库中的依赖关系来解决它,该库也仅在调试配置中配置,因此,在我更改了一些代码后,它开始出现与您相同的错误。

找到它并不简单,因为错误不清楚,并且依赖是通过项目设置中的“附加依赖”设置的。

于 2014-10-24T21:27:58.403 回答
0

打开 Visual Studio 并卸载您的项目,然后转到项目文件夹并打开文件 .vcxproj 。搜索标签“targetFrameworkVersion”(如果不存在,则表示您的项目未使用 dot net frameworks.so 无需更改)将其更改为所需版本保存文件。现在重新加载项目。

于 2018-09-29T19:08:49.040 回答