Недавно я интегрировал компонент ведения журнала .NET NLog в одно из наших приложений, разработанных исключительно в неуправляемом коде (компоненты C ++ и VB6, скомпилированные в Visual Studio 6). У нас есть несколько приложений C ++, которые общаются с NLog через интерфейс COM.
В настоящее время все работает нормально, но я заметил, что появляется следующее сообщение (в окне вывода при отладке компонента C ++ в VS6; как приглашение в IDE при отладке NLog через VS 2005) во время завершения программы:
LoaderLock был обнаружен Сообщение:
Попытка управляемого исполнения внутри ОС
Блокировка погрузчика. Не пытайтесь бежать
управляемый код внутри DllMain или изображения
функция инициализации, так как это делает
может привести к зависанию приложения.
DllMain выглядит следующим образом:
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
Я предполагаю, что _Module.Term();
теперь включает в себя освобождение некоторых ссылок .NET (я сохраняю ссылку на объект NLog в одном из моих классов C ++, чтобы избежать необходимости каждый раз создавать и освобождать его), что вызывает это предупреждение всплыть.
Мой вопрос: это безопасно игнорировать? Если это не так, что является хорошим решением? (лучшее, что я могу придумать, - это создать ссылку на этот объект NLog и выпускать ее каждый раз, когда я хочу записать в файл журнала ... не самое элегантное из решений)