Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 Visual Studio 2010 C++/处于静态库模式的CLI:找不到程序集';mscorlib.dll';_Visual Studio 2012_Compiler Errors_C++ Cli_64 Bit - Fatal编程技术网

Visual studio 2012 Visual Studio 2010 C++/处于静态库模式的CLI:找不到程序集';mscorlib.dll';

Visual studio 2012 Visual Studio 2010 C++/处于静态库模式的CLI:找不到程序集';mscorlib.dll';,visual-studio-2012,compiler-errors,c++-cli,64-bit,Visual Studio 2012,Compiler Errors,C++ Cli,64 Bit,我正在使用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 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程序集的引用,我不想向它添加磁盘文件引用,因为这似乎不合逻辑!以前有人面对过吗

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

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

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

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


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

请注意,针对不同于您在计算机上安装的.NET版本的.NET是一件非常危险的事情,尤其是如果您希望针对4.0并安装了4.5.x。.vcxproj文件中的关键元素是
。如果您启动的项目针对的是旧的.NET版本,则该文件将丢失,您必须自己插入该文件。IDE也不支持更改它(如果存在),请再次手动编辑

这足以诱使MSBuild生成正确的编译命令。您可以通过查看项目的调试生成目录的*.tlog子目录来验证这一点。cl.command.1.tlog文件显示了传递给编译器的选项。它应包括:

/AI“C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETFramework\v4.0”
/FU“C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETFramework\v4.0\mscorlib.dll”


请注意子目录,它与预期的.NET目标匹配非常重要。本例中为v4.0。非常重要的是,它不能指向c:\windows\microsoft.net,这是引用程序集的旧位置。

我也有同样的问题。DLL不起作用,因为我需要为.NET对象提供一个本地C++包装器,这样它就可以实现一个NATCE C++接口——我不能在.dll接口中使用.NET——这给编译错误< /p> 它在VS2010中作为一个静态库工作(使用.NET4)


我的一些可执行文件和DLL也有一些/clr代码。他们没有问题。我不想做一个网络浏览器。

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


我通过如下更改项目设置(对于包含引发此错误的托管.cpp文件的项目)来解决此问题:在项目设置中| C/C++| General | Additional#使用目录,我添加了宏$(FrameworkPathOverride)。这将解析为目标.NET版本的引用程序集目录,在我的示例中是C:\Program Files(x86)\reference assembly\Microsoft\Framework.NETFramework\v4.5.1

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


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

打开visual studio并卸载项目,然后转到项目文件夹并打开文件.vcxproj。搜索标记“targetFrameworkVersion” (如果不存在,则表示您的项目未使用.net框架。因此不需要更改) 将其更改为所需版本 保存文件。
现在重新加载项目。

这离现实已经不远了。实际上,将程序集与本机代码合并非常容易(虽然不是很推荐)-我已经这样做过好几次,事实上我的部分工作包括CLR程序集中的本机代码-但是合并它们让我添加了另一个构建步骤,我想避免这一步。。。所以我选择了传统的方法分别引用每个程序集。。。。关于C++/CLI是一种“互操作语言”的部分没有任何意义。我认为你需要对你选择的主题做一些研究。(微软)互操作与语言本身无关,不可能有任何“互操作语言”——互操作在某种程度上是语言之间的桥梁。请不要把你的假设和幻想说成是确凿的事实