/clr (Common Language Runtime 編譯)

啟用應用程式和元件,以便使用 Common Language Runtime (CLR) 中的功能。

/clr[:options]

引數

  • options
    下列一個或多個參數都以逗號分隔。

    • /clr
      建立應用程式的中繼資料。中繼資料可由其他 CLR 應用程式使用,並讓應用程式能夠使用其他 CLR 元件之中繼資料中的型別和資料。

      如需詳細資訊,請參閱

      混合 (原生和 Managed) 組件

      HOW TO:移轉至 /clr.

    • /clr:pure
      會產生僅有 Microsoft 中繼語言 (MSIL) 的輸出檔,其中沒有可執行的機器碼。不過,它可以包含編譯成 MSIL 的原生型別。

      如需詳細資訊,請參閱 純粹的和可驗證的程式碼 (C++/CLI)

    • /clr:safe
      產生僅含 MSIL (沒有可執行機器碼) 的可驗證輸出檔。/clr:safe 會啟用驗證診斷 (PEVerify 工具 (Peverify.exe))。

      如需詳細資訊,請參閱 Writing Verifiably Type-Safe Code

    • /clr:oldSyntax
      啟用 Managed Extensions for C++ 語法,亦即適用於 CLR 程式設計的原始 Visual C++ 語法。 

      Managed Extensions for C++ 語法已被取代。請只在維護使用 Managed Extensions for C++ 的應用程式時,使用 /clr:oldSyntax。如果您正在開發新的應用程式,請使用更新的語法。如需詳細資訊,請參閱執行階段平台的元件擴充功能

      如果您有 Managed Extensions for C++ 應用程式,即可升級專案以使用新的語法。如需詳細資訊,請參閱 移植和升級程式

    • /clr:noAssembly
      指定組件資訊清單不應插入輸出檔中。根據預設,noAssembly 選項沒有作用。

      noAssembly 選項已被取代。請改用 /LN (建立 MSIL 模組)。如需詳細資訊,請參閱 Deprecated Compiler Options

      在資訊清單中沒有組件中繼資料的 Managed 程式稱為「模組」(Module)。noAssembly 選項只能用於產生模組。如果您使用 /c/clr:noAssembly 編譯,則請在連結器階段中指定 / NOASSEMBLY 選項以建立模組。

      在 Visual C++ 2005 之前,/clr:noAssembly暗示**/clr**。不過,現在 /clr 也支援 /clr:oldSyntax,因此指定 /clr:noAssembly 時,您也必須指定 /clr 形式。例如,/clr:noAssembly /clr 會使用新的 Visual C++ CLR 語法建立模組,/clr:noAssembly,oldSyntax 則會使用 Managed Extensions for C++ 建立模組。

      在 Visual C++ 2005 之前,/clr:noAssembly需要**/LD**.現在當您指定 /clr:noAssembly 時,便會隱含 /LD

    • /clr:initialAppDomain
      可讓 Visual C++ 應用程式在 CLR 的第 1 版上執行。如果您使用 initialAppDomain,就可能會看到 Microsoft 支援網站上 BUG:使用 Managed Extensions for Visual C++ 元件時的 AppDomainUnloaded 例外狀況所討論的一些問題。

      使用 initialAppDomain 編譯的應用程式不應由使用 ASP.NET 的應用程式來使用,因為 CLR 的第 1 版並不支援此種應用程式。

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

備註

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

如需如何開發定義及使用 Managed 型別之應用程式的詳細資訊,請參閱執行階段平台的元件擴充功能

使用 /clr 編譯的應用程式不一定會包含 Managed 資料。

若要在 Managed 應用程式中啟用偵錯,請參閱 /ASSEMBLYDEBUG (加入 DebuggableAttribute)

只有 CLR 型別會在回收記憶體的堆積上具現化。如需詳細資訊,請參閱類別和結構 (C++ 元件擴充功能)。若要將函式編譯成機器碼,請使用 unmanaged pragma。如需詳細資訊,請參閱 managed, unmanaged

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

如果使用 /c 編譯,即可用 /CLRIMAGETYPE 指定所產生輸出檔的 CLR 型別 (IJW、safe 或 pure)。

/clr 隱含 /EHa,而且不對 /clr 支援其他任何 /EH 選項。如需詳細資訊,請參閱 /EH (例外狀況處理模型)

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

傳遞至指定連結器之引動過程的所有模組,都必須使用相同的執行階段程式庫編譯器選項 (/MD/LD) 進行編譯。

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

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

原生物件檔中的全域變數會先初始化 (如果可執行檔是 DLL,則會在 DllMain 期間),然後再初始化 Managed 區段中的全域變數 (在執行任何 Managed 程式碼之前)。#pragma7977wcck(v=vs.110).md 只會影響在 Managed 和 Unmanaged 分類內初始化的順序。

使用 /clr:safe 進行編譯,就類似在 C# 一類語言中使用 /platform:anycpu 進行編譯。

安全和純映像

純映像會使用 C 執行階段 (CRT) 程式庫的 CLR 版本。不過,CRT 是無法驗證的,因此您不能在使用 /clr:safe 編譯時使用 CRT。如需詳細資訊,請參閱 CRT 程式庫功能

不能出現在純映像中之原生程式碼的範例,包括內嵌組件、setjmplongjmp

純映像或安全映像的每個進入點都是 Managed 的。當您使用 /clr 進行編譯時,進入點會是原生的。如需詳細資訊,請參閱 __clrcall

當您使用 /clr:safe 進行編譯時,根據預設,變數會是 appdomain,而且不能根據每個處理程序設定。對於 /clr:pure,儘管 appdomain 是預設值,您卻可以使用 process 變數。

在 64 位元作業系統上執行利用 /clr/clr:pure 編譯的 32 位元 .exe 檔時,應用程式將在 WOW64 之下執行,而讓 32 位元應用程式能在 64 位元作業系統上的 32 位元 CLR 上執行。預設情況下,使用 /clr:safe 編譯的 .exe 檔案,會在執行 64 位元作業系統的電腦上,在 64 位元 CLR 上執行。(在 32 位元作業系統上,相同的.exe 檔案會在 32 位元 CLR 上執行)。 不過,安全的應用程式無法載入 32 位元元件。在此情況下,載入 32 位元應用程式時,在作業系統之 64 位元支援下執行的安全映像將失敗 (BadFormatException)。若要確保在 64 作業系統上載入 32 位元時繼續執行安全映像,必須使用 /CLRIMAGETYPE 變更中繼資料 (.corflags),將它標記為在 WOW64 下執行。下列的命令列為範例。(取代您自己的項目符號)。

cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console

如需如何取得裝飾名稱的詳細資訊,請參閱使用清單檢視裝飾名稱 的資訊。如需 64 位元程式設計的詳細資訊,請參閱 設定程式的 64 位元 (Visual C++)

如需範例、逐步解說和詳細資訊,請參閱:

中繼資料和未命名的類別

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

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

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

若要在 Visual Studio 中設定這個編譯器選項

  1. 在 [方案總管] 中,請以滑鼠右鍵按一下專案名稱,然後按一下 [屬性] 開啟專案 [屬性頁] 對話方塊。

  2. 選取 [組態屬性] 資料夾。

  3. 在 [一般] 屬性頁上,修改 [Common Language Runtime] 屬性。

    注意事項注意事項

    在 [屬性頁] 對話方塊中啟用 /clr 時,與 /clr 不相容的編譯器選項屬性也會視需要而調整。例如,如果已設定 /RTC,然後又啟用 /clr,將會關閉 /RTC

    此外,在偵錯 /clr 應用程式時,請將 [偵錯工具類型] 屬性設定為 [混合] 或 [僅限 Managed]。如需詳細資訊,請參閱 C++ 偵錯組態的專案設定

    如需如何建立模組的詳細資訊,請參閱 /NOASSEMBLY (建立 MSIL 模組)

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

請參閱

參考

編譯器選項

設定編譯器選項