装载机锁(REGSVR32 R6033误差)与受管理的C ++ DLL(Loader lock (r

2019-08-03 01:30发布

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

R6033 -尝试本地代码初始化过程中使用MSIL代码从此程序这表明在应用程序中的错误。 这是最有可能从本机的构造函数或DllMain中调用一个MSIL编译(/ CLR)函数的结果。

我读到Loader锁定而无法弄清楚 - 我还没有添加任何托管代码的单一调用。 这里的DllMain的程序的整个身体:

[编辑 - 每下面的评论,我说的#pragma非托管到没有改善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
}

Answer 1:

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

这是Visual Studio的“精灵”确实,这里是我是如何进行测试:

  • 创建一个Visual C ++ ATL项目
  • 增加了一个ATL简单对象,为了有一个COM接口(项目 - >添加类)
  • 增加了一个CLR组件类。 向导提示我:“你要添加CLR组件的本地项目,你的项目将被转换为具有公共语言运行库支持。”
  • 编译项目,编译好并注册的罚款。
  • 检查项目设置 - >“没有共同语言运行库支持”
  • 检查clrcomponennt.cpp设置 - >“公共语言运行库支持(/ CLR)”
  • 开了DLL在OLEVIEW - > COM接口是本
  • 开业红门.net反射的dll - > clrcomponent存在


Answer 2:

使用/ CLR标志了你的方法来管理(即他们被编译成MSIL),但你调用他们的DllMain这-isn't-管理。 不幸的是,这是我们所据我有限的知识可以把它。



文章来源: Loader lock (regsvr32 R6033 error) with managed C++ dll
标签: c++ clr managed