我最近將.NET NLog日誌記錄組件集成到我們的應用程序中,這些應用程序完全是在非託管代碼(在Visual Studio 6中編譯的C++和VB6組件)開發的。我們有一堆C++應用程序通過COM接口與NLog交談。程序終止時發生LoaderLock錯誤
目前一切正常,但我注意到在程序終止期間彈出以下消息(如果在VS6中調試C++組件,則在輸出窗口中;如果通過VS 2005調試NLog,則在IDE中作爲提示) :
LoaderLock檢測消息: 試圖OS 裝載機鎖內管理的執行。不要試圖在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對象的引用,並在每次我要寫入日誌文件時釋放它;不是最優雅的解決方案)
從非託管C++ DLL訪問文件如何導致託管C#代碼執行? – 2009-04-23 11:29:40