我有一个实现多个 COM 接口(interface)的 C++ dll,我正在尝试将其迁移到托管 C++。我设置了/clr 编译器标志并将运行时库属性从/MT 更改为/MD 以避免这两个标志之间的冲突,但这就是我所做的全部更改。当它在构建过程中尝试注册 dll 时,出现以下错误:
R6033 - 尝试在 native 代码初始化期间使用此程序集中的 MSIL 代码 这表明您的应用程序中存在错误。这很可能是从 native 构造函数或 DllMain 调用 MSIL 编译 (/clr) 函数的结果。
我阅读了有关 Loader Lock 的内容,但无法理解 - 我没有添加对任何托管代码的单个调用。这是 DllMain 过程的整个主体:
[编辑 - 根据下面的评论,我将 #pragma unmanaged 添加到 cpp 文件的顶部,但没有任何改进。据我所知,模块初始化是 ATL 库中包含的所有代码。]
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
lpReserved;
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &MYGUID);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
最佳答案
您只需将/clr 编译器标志添加到使用托管代码的文件,而不是整个项目。
这是 Visual Studio“向导”所做的,这是我测试的方式:
- 创建一个 Visual C++ ATL 项目
- 添加了一个 ATL 简单对象,以便拥有一个 COM 接口(interface)(项目->添加类)
- 添加了一个 CLR 组件类。向导提示我“您正在将 CLR 组件添加到 native 项目。您的项目将被转换为具有公共(public)语言运行时支持。”
- 编译项目,编译正常,注册正常。
- 检查了项目设置 -> “无公共(public)语言运行时支持”
- 检查了 clrcomponennt.cpp 设置 -> “公共(public)语言运行时支持 (/clr)”
- 在 OleView 中打开 dll -> 存在 COM 接口(interface)
- 在 Red Gate 的 .NET Reflector 中打开 dll -> 存在 clrcomponent
关于c++ - 带有托管 C++ dll 的加载程序锁(regsvr32 R6033 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1349530/