托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)

Posted

技术标签:

【中文标题】托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)【英文标题】:Loader lock (regsvr32 R6033 error) with managed C++ dll 【发布时间】:2009-08-28 21:40:45 【问题描述】:

我有一个 C++ dll,它实现了几个 COM 接口,我正在尝试迁移到托管 C++。我设置了 /clr 编译器标志并将运行时库属性从 /MT 更改为 /MD 以避免这两个标志之间的冲突,但这就是我所做的全部更改。在构建过程中尝试注册 dll 时,出现以下错误:

R6033 - 在本机代码初始化期间尝试使用此程序集中的 MSIL 代码 这表明您的应用程序中存在错误。这很可能是从本机构造函数或 DllMain 调用 MSIL 编译 (/clr) 函数的结果。

我阅读了有关加载程序锁定的信息,但无法弄清楚 - 我没有添加对任何托管代码的单个调用。下面是整个 DllMain 过程:

[编辑 - 根据下面的评论,我将 #pragma unmanaged 添加到 cpp 文件的顶部,但没有任何改进。据我所知,Module init 是 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

【问题讨论】:

【参考方案1】:

您只需要将 /clr 编译器标志添加到使用托管代码的文件,而不是整个项目。

这就是 Visual Studio“向导”所做的,这是我测试的方式:

创建 Visual C++ ATL 项目 添加了一个 ATL 简单对象,以便拥有一个 COM 接口(项目->添加类) 添加了 CLR 组件类。向导提示我“您正在将 CLR 组件添加到本机项目。您的项目将被转换为具有公共语言运行时支持。” 编译项目,编译正常,注册正常。 检查项目设置 -> “没有公共语言运行时支持” 检查了 clrcomponennt.cpp 设置 -> “公共语言运行时支持 (/clr)” 在 OleView 中打开 dll -> 存在 COM 接口 在 Red Gate 的 .NET Reflector 中打开了 dll -> 存在 clrcomponent

【讨论】:

谢谢,明白了。我没有意识到我可以逐个文件设置标志 - 将带有 DLL 初始化代码的文件切换为非 /clr 固定,同时将 /clr 开关保持在项目的其余部分。跨度> 【参考方案2】:

使用 /clr 标志已使您的方法受管理(即,它们被编译为 MSIL),但您为 DllMain 调用它们,而这 - 不是 - 受管理的。不幸的是,就我有限的知识所能承受的范围而言。

【讨论】:

是的,这很有意义...我在文件顶部添加了#pragma unmanaged,但没有帮助。

以上是关于托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)的主要内容,如果未能解决你的问题,请参考以下文章

C# Windows 窗体无法在 Windows10 上加载非托管 C++ DLL

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

如何从非托管 COM dll 生成类型库

在非托管 C++ DLL 和托管 C# UI 之间发送信息

如何在非托管 c++ dll 中查找调用方程序集名称

VC++通过查看ReactOS开源代码,解决完整路径dll加载失败问题(附源码)