/clr (Common Language Runtime 編譯)

讓應用程式和元件能夠使用 Common Language Runtime (CLR) 中的功能,並啟用 C++/CLI 編譯。

語法

/clr[ : options ]

引數

options
下列一或多個逗號分隔引數。

  • none

    沒有選項, /clr 會建立元件的中繼資料。 中繼資料可由其他 CLR 應用程式取用,並可讓元件取用其他 CLR 元件中繼資料中的類型和資料。 如需詳細資訊,請參閱混合 (原生與受控) 組件

  • netcore

    從 Visual Studio 2019 16.4 版開始提供, /clr:netcore 使用最新的跨平臺 .NET Framework,也稱為 .NET Core,為元件建立中繼資料和程式碼。 其他 .NET Core 應用程式可以使用中繼資料。 此外,選項可讓元件取用其他 .NET Core 元件中繼資料中的類型和資料。

  • nostdlib

    指示編譯器忽略預設 \clr 目錄。 如果您包含多個 DLL 版本,例如 System.dll,編譯器會產生錯誤。 此選項可讓您指定要在編譯期間使用的特定架構。

  • pure

    /clr:pure 已被取代 。 該選項已在 Visual Studio 2017 和更新版本中移除。 建議您將必須是純 MSIL 的程式碼移植到 C#。

  • safe

    /clr:safe 已被取代 。 該選項已在 Visual Studio 2017 和更新版本中移除。 建議您將必須是安全 MSIL 的程式碼移植到 C#。

  • noAssembly

    /clr:noAssembly 已被取代 。 請改用 /LN [建立 MSIL 模組]。

    告知編譯器不要將元件資訊清單插入輸出檔中。 根據預設, noAssembly 選項不會生效。

    資訊清單中沒有元件中繼資料的 Managed 程式稱為 模組 。 選項 noAssembly 只能用來產生模組。 如果您使用 和 /clr:noAssembly 進行編譯 /c ,請在連結器階段中指定 /NOASSEMBLY 選項來建立模組。

    在 Visual Studio 2005 之前, /clr:noAssembly 需要 /LD/LD 當您指定 /clr:noAssembly 時,現在會隱含 。

  • initialAppDomain

    initialAppDomain 已經過時 。 可讓 C++/CLI 應用程式在 CLR 第 1 版上執行。 使用 initialAppDomain 編譯的應用程式不應該由使用 ASP.NET 的應用程式使用,因為它在 CLR 第 1 版中不受支援。

備註

Managed 程式碼是可由 CLR 檢查和管理的程式碼 。 Managed 程式碼可以存取 Managed 物件。 如需詳細資訊,請參閱 /clr 限制

如需如何在 C++ 中開發定義及取用 Managed 類型的應用程式的相關資訊,請參閱 執行時間平臺的元件延伸模組

使用 /clr 編譯的應用程式可能包含或可能不會包含 Managed 資料。

若要在受控應用程式上啟用偵錯,請參閱 /ASSEMBLYDEBUG [新增 DebuggableAttribute]。

只有 CLR 類型會在垃圾收集堆積上具現化。 如需詳細資訊,請參閱類別與結構。 若要將函式編譯為原生程式碼,請使用 unmanaged pragma。 如需詳細資訊,請參閱 managedunmanaged

根據預設, /clr 不會生效。 當 /clr 作用中時, /MD 也會生效。 如需詳細資訊,請參閱 /MD/MT/LD (使用執行時間程式庫)。 /MD 確保從標準標頭檔選取動態連結、多執行緒版本的執行時間常式。 Managed 程式設計需要進行多執行緒處理,因為 CLR 記憶體回收行程會在輔助執行緒中執行完成項。

如果您使用 編譯 /c ,您可以使用 連結器選項來指定所產生輸出檔案 /CLRIMAGETYPE 的 CLR 類型。

/clr/EHa表示 ,不支援其他 /EH 選項 /clr 。 如需詳細資訊,請參閱 /EH (例外狀況處理模型)。

如需如何判斷檔案 CLR 映射類型的詳細資訊,請參閱 /CLRHEADER

傳遞至指定連結器調用的所有模組都必須使用相同的執行時間程式庫編譯器選項 ( /MD/LD ) 進行編譯。

/ASSEMBLYRESOURCE使用連結器選項在元件中內嵌資源。 /DELAYSIGN/KEYCONTAINER/KEYFILE 連結器選項也可讓您自訂群組件建立方式。

使用 時 /clr ,符號 _MANAGED 會定義為 1。 如需詳細資訊,請參閱 預先定義的宏

原生物件檔中的全域變數會先初始化( DllMain 如果可執行檔是 DLL),然後初始化 Managed 區段中的全域變數(在執行任何 Managed 程式碼之前)。 #pragma init_seg 只會影響 Managed 和 Unmanaged 類別中的初始化順序。

中繼資料和未命名的類別

未命名的類別會出現在中繼資料名稱下,例如 $UnnamedClass$<crc-of-current-file-name>$<index>$ ,其中 <index> 是編譯中未命名類別的循序計數。 例如,下列程式碼範例會在中繼資料中產生未命名的類別。

// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;

使用 ildasm.exe 可檢視中繼資料。

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 將 [組態 ] 下拉式清單設定為 [所有組態 ],並將 [ 平臺 ] 下拉式清單設定 [所有平臺 ]。

  3. 選取 [ 組態屬性 > C/C++ > 一般 ] 頁面。

  4. 修改 Common Language Runtime Support 屬性。 選取 [確定] 儲存您的變更。

注意

在 Visual Studio IDE 中, /clr 您可以在 [屬性頁] 對話方塊的 [組態屬性 > C/C++ > 一般 ] 頁面上個別設定 編譯器選項。 不過,建議您使用 CLR 範本來建立專案。 它會設定成功建立 CLR 元件所需的所有屬性。 設定這些屬性的另一種方式是在 [屬性頁] 對話方塊的 [組態屬性 > 進階 ] 頁面上,使用 Common Language Runtime Support 屬性。 這個屬性會一次設定所有其他 CLR 相關工具選項。

若要以程式方式設定這個編譯器選項

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法