如果我将模式切换到静态库
当您尝试使用有效的 /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,即引用程序集的旧位置。