C++ cli 加载库193 我正在创建一个C++或CLI DLL,它将被加载到一个传统的C++应用程序中。遗留应用程序通过对LoadLibrary的传统调用来实现这一点。应用程序和C++/CLI dll均以64位模式编译

C++ cli 加载库193 我正在创建一个C++或CLI DLL,它将被加载到一个传统的C++应用程序中。遗留应用程序通过对LoadLibrary的传统调用来实现这一点。应用程序和C++/CLI dll均以64位模式编译,c++-cli,64-bit,manifest,mscorlib,C++ Cli,64 Bit,Manifest,Mscorlib,当LoadLibrary调用发生时,它失败并出现错误193。这通常意味着某些非64位组件正在尝试加载。在visual studio 2010中查看dll加载输出时,我看到加载mscoree.dll时发生故障(确切地说,我看到加载了我的dll,然后加载了mscoree,然后卸载了mscoree,然后卸载了我的dll,然后返回错误)。特别是C:\Windows\System32\mscoree.dll正在加载,当我检查这个mscoree.dll时,我发现它的目标是I386 如何确保我的应用程序链接到

当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版本仍在加载

谢谢

马克斯

C++/CLI dll上CorFlags.exe的输出 在C:\System32\mscoree.dll上输出pedump.exe (pedump从这里开始描述进口和出口,但这在这里并不重要)

扩展加载信息 这是失败加载的完整输出

注意:C++/CLI dll称为DsfClr.dll
输出是通过运行gflags.exe-i[exename]+sls并在调试器中检查结果获得的

更新: 使用Reuben在下面的评论中发布的提示,我能够确定mscoree.dll确实针对AMD64,但pedump提供的信息无效,因为它正在WOW64中运行。尽管如此,我仍然无法加载此库,如果任何人有任何建议,将不胜感激

我还尝试了一件事:我创建了一个新的C#应用程序并引用了C++/CLI dll,然后在main()函数中,我在C++/CLI dll中实例化了一个类。这导致在调用main()函数之前发生访问冲突异常。当我删除实例化时,主函数运行良好。我的猜测是,实例化导致了我的C++/CLI程序集的延迟加载,这与我在本机程序集中看到的加载错误相同。

如果有人遇到此错误,结果表明它是由我的本机库使用boost::threading引起的。线程库使用了一些奇怪的编译设置。结果是静态库与clr或混合模式二进制文件不兼容。当然,VisualStudio对此一无所知,所以它很高兴地将boost链接进来,并在加载dll时崩溃
解决方案是在boost::threading中动态链接。最简单的方法是在项目设置中定义BOOST\u THREAD\u DYN\u链接。一旦我定义了它,dll就可以正常加载了

在google上快速搜索C++/CLI boost threading将提供有关此错误的更多信息

我只是有一个类似的场景。 LoadLibrary失败,错误为193。 My DLL是一个托管的C++/CLI DLL,通过LoadLibrary从本机应用程序调用

然而,我只在win7系统上得到错误。它在win10上加载良好。这个原始问题的日期表明它是win7

我把它缩小到一个本地类。 win7似乎只支持基本类型,例如C指针作为本地线程。任何更复杂的东西,即使是win10接受的std::shared_ptr,在加载Dll时都会生成错误193


请注意,编译器是VS2015,代码样式是c++11。

+1为这种情况下的问题提供了答案,谢谢!
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
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
...