Почему я получаю обнаружение LoaderLock?

Я вызываю DLL C++ (не мой код) из моего кода C#, используя мой P / Invoked LoadLibrary API. но когда я запускаю приложение, обнаруживается ошибка LoaderLock.

сначала я виню в этом мои обертки DllImport C#, но когда я пытаюсь загрузить другую C++ DLL, она работает нормально.

Я прочитал несколько статей в Интернете, касающихся LoaderLock, и кажется, что правило № 1 - не делать ничего смешного в DllMain. и когда я проверил, C++ DllMain вызывает некоторые API в DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH.

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 ответов

Другие вопросы по тегам