共用方式為


HOW TO:移除 _vcclrit.h 的相依性

更新:2007 年 11 月

在 Visual C++ .NET 和 Visual C++ 2003 中,使用 /clr 編譯器選項編譯的 DLL,在載入時可能會隨機發生死結。這個問題通常稱為載入器鎖定問題,在混合組件的初始化中會有詳細說明。

為了解決這個問題,在 Visual C++ 2003 中提供了 _vcclrit.h,使用可避免載入器鎖定的方式,協助初始化 DLL。對於 Visual C++ 2005,會以完全不同的方式處理初始化,以便有效地減少死結 (Deadlock) 的機會,所以不再需要這個標頭檔。

基於回溯相容性 (Backward Compatibility),仍然會提供 _vcclrit.h,而使用此標頭檔的程式碼還是可以運作,不過 _vcclrit.h 的內容已經被取代。本主題包含移除此標頭檔相依性所需的必要修改。

注意事項:

雖然不是理想的解決方式,但是您可以在包含 _vcclrit.h 之前定義 _CRT_VCCLRIT_NO_DEPRECATE,讓使用 _vcclrit.h 不會產生取代警告。

連結器設定變更

以下是從使用了建議的 Visual C++ 2003 載入器鎖定解決方式的專案中,移除 _vcclrit.h 時所需的變更。這些變更都涉及連結器設定的變更。如需在 Visual Studio 中變更這些設定的指示,請參閱修改專案設定

  • 移除 /NOENTRY 連結器參數。使用 _vcclrit.h 時,需要提供 /NOENTRY (沒有進入點) 參數給連結器。這項動作現在已不需要。

  • 請勿將 MSVCRT.LIB 輸入至連結器。因為之前需要 /NOENTRY 參數,所以也需要將它明確連結至 CRT 程式庫檔 MSVCRT.LIB。現在 /NOENTRY 已移除,而這個程式庫在 /clr 編譯下預設會連結。

  • 從連結器輸入中移除 NOCHKCLR.OBJ。已不再需要這個檔案。

  • 移除強制的符號參考。在前一版中,您必須使用 /INCLUDE 參數強制參考以下符號:__DllMainCRTStartup@12、__crt_dll_initialize 和 __crt_dll_terminate。在 Visual C++ 2005 中已不需要這些符號,所以可以安全地移除。

程式碼變更

除了從程式碼中移除 #include <_vcclrit.h> 以外,視程式碼的性質而定,可能還需要一些額外的變更。至少已不再叫用 __crt_dll_initialize 和 __crt_dll_terminate,所以可以移除。

請參閱

概念

混合 (原生和 Managed) 組件