共用方式為


/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 程式碼之前)。 #pragma 7977wcck(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 模組)

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

請參閱

參考

編譯器選項

設定編譯器選項