代码之家  ›  专栏  ›  技术社区  ›  flatline

带有托管C++ DLL的加载器锁(ReVSR32 R6033错误)

  •  3
  • flatline  · 技术社区  · 15 年前

    我有一个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
    }
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   Cristian Adam    15 年前

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

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

    • 创建Visual C++ ATL项目
    • 添加了ATL简单对象,以便具有COM接口(Project->添加类)
    • 添加了一个clr组件类。向导提示我“您正在向本机项目添加一个CLR组件。”您的项目将被转换为具有公共语言运行时支持。“
    • 编制项目、编制罚款和登记罚款。
    • 已检查项目设置->“无公共语言运行时支持”
    • 已检查clrcomponent.cpp设置->“公共语言运行时支持(/clr)”
    • 在oleview中打开了dll->存在COM接口
    • 在Red Gate的.NET Reflector中打开dll->clr组件存在
        2
  •  0
  •   Rushyo    15 年前

    使用/clr标志已使您的方法被管理(即,它们被编译为msil),但您正在为dllmain调用它们,dllmain不被管理。不幸的是,就我有限的知识而言。