2009-08-28 51 views
3

我有一個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 
} 

回答

4

您需要將/ clr編譯器標誌僅添加到使用託管代碼的文件,而不是整個項目。

這是Visual Studio的「精靈」確實,這裏是我是如何測試:

  • 創建一個Visual C++ ATL項目
  • 增加了ATL簡單對象,爲了有一個COM界面(Project-> Add Class)
  • 添加了一個CLR組件類。嚮導提示我「您正在向本地項目添加CLR組件,您的項目將被轉換爲具有Common Language Runtime支持。」
  • 編譯項目,編譯正確,註冊正常。
  • 經過項目設置 - > 「沒有共同語言運行庫支持」
  • 經過的clrcomponennt.cpp設置 - > 「公共語言運行庫支持(/ CLR)」
  • 開業OLEVIEW的dll - > COM接口是目前
  • 開業紅門.net反射的dll - > clrcomponent存在
+1

謝謝,明白了。我沒有意識到我可以逐個文件地設置標誌 - 將帶有DLL初始化代碼的文件切換到非/ clr固定狀態,同時使/ clr開關保持項目的其餘部分不變。 – flatline 2009-08-31 12:56:33

0

使用/ CLR標誌了你的方法來管理(即他們被編譯成MSIL),但你稱他們爲DllMain,而不是管理。不幸的是,就我的有限知識而言,這是可以接受的。

+0

是啊,這將使意義......我說的#pragma非託管到該文件的頂部,但它並沒有幫助。 – flatline 2009-08-28 21:46:22