为什么我会收到“LoaderLock”检测?

时间:2017-08-23 02:44:53

标签: c++ interop pinvoke dllmain loaderlock

我使用我的P / Invoked LoadLibrary API从我的c#代码调用c ++ DLL(不是我的代码)。但是当我运行应用程序时,正在检测到LoaderLock错误。

起初我责怪我的DllImport C#包装器,但是当我尝试加载其他C ++ DLL时,它运行正常。

我在线阅读了一些关于LoaderLock的文章,似乎#1规则并不是在DllMain中做任何有趣的事情。当我检查c ++时,DllMain正在调用DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH中的一些API。

BOOL APIENTRY DllMain(
    HANDLE  hModule, 
    DWORD   ul_reason_for_call, 
    LPVOID  lpReserved )
{
    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACH:

                StartAPI();
                break;

        case DLL_THREAD_ATTACH:
                break;

        case DLL_THREAD_DETACH:
                break;

        case DLL_PROCESS_DETACH:

                ExitAPI();
                break;
    }
    return true;
}

当我检查StartAPI()时,它有很大一部分代码,并使用 CreateProccessA

调用一个创建过程的函数

这是真正的原因,为什么我得到一个LoaderLock错误?

我被告知StartAPI()应该在DLL的初始化时运行,有没有其他方法可以使这个工作?

我打算在另一个线程中调用StartAPI(),但我读过在DllMain中创建一个线程也是一个灾难的秘诀。

谢谢!

0 个答案:

没有答案