我有一個C++ DLL實現了幾個COM接口,我試圖遷移到託管C++。我設置了/ clr編譯器標誌,並將運行時庫屬性從/ MT更改爲/ MD,以避免這兩個標誌之間的衝突,但這些都是我改變了。當它試圖在構建過程中註冊DLL,我得到以下錯誤:加載程序鎖(regsvr32 R6033錯誤)與託管C++ dll
R6033 - 嘗試本地代碼初始化 這期間使用MSIL代碼從本次大會表示你的應用程序中的錯誤。這很可能是從本地構造函數或DllMain調用MSIL編譯(/ clr)函數的結果。
我讀過關於Loader Lock的知識,但無法弄清楚 - 我沒有向任何託管代碼添加單個調用。下面是整個DllMain過程的主體:
[編輯 - 下面的評論,我添加了#pragma unmanaged到cpp文件的頂部沒有任何改進。該模塊初始化是從什麼我可以告訴在ATL庫中包含的所有代碼。]
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
lpReserved;
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &MYGUID);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
謝謝,明白了。我沒有意識到我可以逐個文件地設置標誌 - 將帶有DLL初始化代碼的文件切換到非/ clr固定狀態,同時使/ clr開關保持項目的其餘部分不變。 – flatline 2009-08-31 12:56:33