0

我正在使用我的 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 中创建线程也是灾难的根源。

谢谢!

4

0 回答 0