共用方式為


/clr (Common Language Runtime 編譯)

更新:2007 年 11 月

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

/clr[:options]

引數

  • options
    下列一個或多個項目是以逗號分隔:

    • /clr
      為您的應用程式建立可由其他 CLR 應用程式使用的中繼資料,並允許您的應用程式使用其他 CLR 元件中繼資料內的型別和資料。

      如需詳細資訊,請參閱:

    • /clr:pure
      產生沒有可執行機器碼僅 MSIL 的輸出檔,但是它可以包含編譯成 MSIL 的原生型別。

      如需詳細資訊,請參閱純粹的和可驗證的程式碼

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

      如需詳細資訊,請參閱撰寫可驗證的型別安全程式碼

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

      注意:Managed Extensions for C++ 語法在 Microsoft Visual C++ 2005 中已被取代。在維護使用 Managed Extensions for C++ 的 Visual C++ 應用程式時,只能夠使用 /clr:oldSyntax。如果您要開發新的應用程式,請使用更新的語法;如需詳細資訊,請參閱Language Features for Targeting the CLR

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

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

      注意noAssembly 選項在 Visual C++ 2005 中已被取代。請改用 /LN (建立 MSIL 模組)。如需詳細資訊,請參閱 Visual C++ 2005 中已被取代的編譯器選項

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

      在 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++ 應用程式在 Common Language Runtime 1 版上執行。如果您使用 initialAppDomain,就可以看到知識庫文件 Q309694 中所討論的一些問題。您可以在 MSDN Library 媒體或是在 https://support.microsoft.com/default.aspx?ln=zh-tw 中找到知識庫文件。

      使用 ASP.NET 的應用程式不得使用以 initialAppDomain 編譯的應用程式;升級到較新的執行階段,以便使用 C++ 進行 ASP.NET 的工作。

備註

Managed 程式碼是 Common Language Runtime 可以檢查和管理的程式碼。Managed 程式碼可以存取 Managed 物件。

請參閱 /clr 限制

如需如何開發定義及自訂 Managed 型別的應用程式之詳細資訊,請參閱Language Features for Targeting the CLR

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

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

只有 CLR 型別會在回收記憶體的堆積上具現化。如需詳細資訊,請參閱Classes and Structs (Managed)。若要將函式編譯成機器碼,請使用 unmanaged pragma。如需詳細資訊,請參閱 managed, unmanaged

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

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

/clr 隱含 /EHa,而不允許其他 /EH 選項與 /clr 同時使用。如需詳細資訊,請參閱 /EH (例外處理模型)

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

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

請使用 /ASSEMBLYRESOURCE (內嵌 Managed 資源) 連結器選項將資源內嵌到組件中。/DELAYSIGN (部分簽署組件)/KEYCONTAINER (指定金鑰容器以簽署組件)/KEYFILE (指定金鑰或金鑰組以簽署組件) 連結器選項也可以讓您自訂建立組件的方式。

使用 /clr 時,_MANAGED 符號是定義為 1。如需詳細資訊,請參閱Predefined Macros

原生目的檔中的全域變數將會先加以初始化 (在 DllMain 期間,如果可執行檔是 DLL 的話),然後會初始化 Managed 區段中的全域變數 (在執行任何 Managed 程式碼以前)。#pragmainit_seg 只會影響 Managed 和 Unmanaged 分類之中的初始化順序。

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

安全和純映像

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

不能出現在純映像中的機器碼範例包括內嵌組譯碼、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 (指定 CLR 映像類型) 變更中繼資料 (.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 with: /clr /LD
class {} x;

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

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

  1. 開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁

  2. 按一下 [組態屬性] 資料夾。

  3. 按一下 [一般] 屬性頁。

  4. 修改 [Common Language Runtime 支援] 屬性。

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

    注意事項:

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

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

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

請參閱

參考

編譯器選項

設定編譯器選項