共用方式為


/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++>General] 頁面上個別設定編譯程式選項。 不過,建議您使用CLR範本來建立專案。 它會設定成功建立 CLR 元件所需的所有屬性。 設定這些屬性的另一種方式是在 [屬性頁] 對話框的 [組態屬性>進階] 頁面上,使用 Common Language Runtime Support 屬性。 這個屬性會一次設定所有其他 CLR 相關工具選項。

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

另請參閱

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