я вызываю 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 также является рецептом для катастрофы.
Спасибо!
Задача ещё не решена.
Других решений пока нет …