Max*_*ich 5 64-bit c++-cli manifest mscorlib
我正在创建一个C++/CLI DLL,它将被加载到遗留的c ++应用程序中.传统应用程序通过对LoadLibrary的传统调用来完成此操作.应用程序和C++/CLI dll都以64位模式编译.
当LoadLibrary调用发生时,它会因错误193而失败.这通常意味着某些非64位组件正在尝试加载.当我在visual studio 2010中查看dll加载输出时,我看到加载mscoree.dll时发生了故障(确切地说,我看到我的dll加载,然后mscoree加载,然后mscoree卸载,然后我的dll卸载,然后返回错误).特别是C:\ Windows\System32\mscoree.dll正在加载,当我检查这个mscoree.dll时,我发现它的目标是I386.
如何确保我的应用程序将链接到正确的mscoree.dll?我知道这可以用清单来完成,但我找不到任何关于设置清单的好信息.理想的解决方案是允许在32位或64位模式下编译并定位正确的mscoree.dll.
作为旁注,我发现并行文件夹中的mscoree.dll是我验证的64位模式,并将其复制到我的应用程序目录中,希望它能先获取该文件.这不起作用,仍然加载C:\ Windows\System32版本.
谢谢,
马克斯
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 : 0
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
(从这里开始描述进口和出口,但这在这里并不重要)
这是失败负载的完整输出.
注意:C++/CLI dll称为DsfClr.dll
,输出是通过运行gflags.exe -i [exename] + sls并在调试器中检查结果获得的
使用Reuben在下面评论中发布的提示,我能够确定mscoree.dll确实以AMD64为目标,但是由于它正在WOW64中运行,因此提供无效信息.话虽如此,我仍然无法加载此库,如果有人有任何建议,他们将不胜感激.
我还尝试了另外一件事:我创建了一个新的C#应用程序并引用了C++/CLI dll,然后,在main()函数中,我在C++/CLI dll中实例化了一个类.这会在调用main()函数之前导致访问冲突异常.当我删除实例化时,main函数运行正常.我的猜测是实例化导致我的C++/CLI程序集的延迟加载,这导致我从本机程序集看到的相同加载错误.
Max*_*ich 13
如果有人遇到这个错误,事实证明它是由我的本地库使用boost :: threading引起的.boost :: threading库使用了一些奇怪的编译设置.结果是一个与clr或混合模式二进制文件不兼容的静态库.当然,visual studio并不知道这一点,所以当加载dll时,它很高兴地链接了boost和crashes.
解决方案是在boost :: threading中动态链接.最简单的方法是在项目设置中定义BOOST_THREAD_DYN_LINK.一旦我定义了这个,dll加载就好了.
快速谷歌搜索C++/CLI增强线程将提供有关此错误的更多信息
| 归档时间: |
|
| 查看次数: |
5828 次 |
| 最近记录: |