使用托管C ++ dll加载器锁定(regsvr32 R6033错误)

时间:2009-08-28 21:40:45

标签: c++ clr managed

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

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

我读到了Loader Lock并且无法解决问题 - 我没有为任何托管代码添加一个调用。这是DllMain程序的整个主体:

[编辑 - 在下面的评论中,我将#pragma unmanaged添加到cpp文件的顶部,没有任何改进。模块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
}

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

使用/ clr标志已经使你的方法得到了管理(即它们被编译成MSIL),但是你正在为DllMain调用它们 - 它们没有被管理。不幸的是,就我的有限知识而言,这是可以接受的。