我正在创建一个C++/CLI,它将加载到一个遗留的c++应用程序中。遗留应用程序通过对LoadLibrary的传统调用来做到这一点。应用程序和C++/CLI dll都是以64位模式编译的。
当LoadLibrary调用发生时,它会失败并返回错误193。这通常意味着某个非64位组件正在尝试加载。当我在visual studio 2010中查看dll load输出时,我发现在加载mscoree.dll时发生了故障(确切地说,我看到我的dll已加载,然后mscoree已加载,mscoree已卸载,然后我的dll已卸载,然后返回错误)。当我检查这个mscoree.dll时,我发现它针对的是I386。
如何确保我的应用程序将链接到正确的mscoree.dll?我知道这可以通过清单来完成,但我找不到任何关于设置清单的好信息。理想的解决方案是允许以32位或64位模式进行编译,并以正确的mscoree.dll为目标。
顺便说一句,我在一个并排的文件夹中找到了一个我验证为64位模式的mscoree.dll,并将其复制到我的应用程序目录中,希望它能先拿到那个。这不起作用,仍然加载了C:\Windows\System32版本。
谢谢,
最大值
C++/CLI上的CorFlags.exe输出
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 16
ILONLY : 0
32BIT : 0
Signed : 0C:\System32\mscoree.dll上的pedump.exe输出
PS C:\Windows\System32> pedump.exe .\mscoree.dll
Dump of file .\MSCOREE.DLL
File Header
Machine: 014C (I386)
Number of Sections: 0004
TimeDateStamp: 4B90752B -> Thu Mar 04 22:06:19 2010
PointerToSymbolTable: 00000000
NumberOfSymbols: 00000000
SizeOfOptionalHeader: 00E0
Characteristics: 2102
EXECUTABLE_IMAGE
32BIT_MACHINE
DLL
...(pedump从这里开始描述进出口,但这在这里并不重要)
扩展加载信息
这是失败加载的完整输出。
注意: C++/CLI称为DsfClr.dll
通过运行gflags.exe -i exename +sls并在调试器中检查结果来获得输出
http://pastebin.com/FyumUiMN
更新:
使用鲁本在下面的评论中发布的技巧,我能够确定mscoree.dll确实针对AMD64,但是pedump提供了无效的信息,因为它是在WOW64中运行的。话虽如此,我仍然不能加载这个库,如果任何人有任何建议,他们将非常感谢。
我尝试过的另一件事是:我创建了一个新的C#应用程序并引用了C++/CLI,然后在main()函数中,我实例化了C++/CLI中的一个类。这导致在调用main()函数之前出现访问冲突异常。当我删除实例化时,main函数运行正常。我的猜测是,实例化导致了C++/CLI程序集的延迟加载,这导致了我在本机程序集上看到的相同加载错误。
发布于 2012-02-21 23:35:24
如果有人遇到这个错误,原来是因为我的本地库使用了boost::threading。threading库使用了一些奇怪的编译设置。结果是一个与clr或混合模式二进制文件不兼容的静态库。当然,visual studio不知道这一点,所以它很高兴链接boost in,并在加载dll时崩溃。
解决方案是动态链接boost::threading。最简单的方法是在项目设置中定义BOOST_THREAD_DYN_LINK。一旦我定义了这一点,dll就可以正常加载。
在google上快速搜索C++/CLI boost threading将提供有关此错误的更多信息
发布于 2018-11-27 22:50:51
我只是有一个类似的场景。LoadLibrary失败,错误为193。我的DLL是一个托管的C++/CLI,它是从具有LoadLibrary的本机应用程序调用的。
然而,我只在win7系统上得到这个错误。它在win10上加载正常。这个原始问题的日期表明它是win7。
我把范围缩小到一个thread_local类。看起来像thread_local一样,win7只支持像C指针这样的基本类型。任何更复杂的东西,即使是win10接受的std::shared_ptr,都会在加载Dll时生成错误193。
根据记录,编译器是VS2015,代码样式是c++11。
https://stackoverflow.com/questions/9353128
复制相似问题