/clr 限制

請注意使用 的下列限制 /clr

  • 在結構化例外狀況處理常式中,使用 編譯 /clr 時會限制使用 _alloca 。 如需詳細資訊,請參閱_alloca

  • 使用執行時間錯誤檢查對 無效 /clr 。 如需詳細資訊,請參閱 如何:使用原生執行時間檢查

  • 當 用來編譯僅使用標準 C++ 語法的程式時 /clr ,下列指導方針適用于使用內嵌元件:

    • 對於假設具有原生堆疊配置、目前函式外呼叫慣例或其他電腦相關低階資訊認知的內嵌組件程式碼,如果該認知套用到受控函式的堆疊框架,則內嵌組件程式碼可能會失敗。 包含內嵌元件程式碼的函式會以 Unmanaged 函式的形式產生,就像它們放在未 /clr 編譯的個別模組中一樣。

    • 不支援傳遞複製建構函式參數之函式中的內嵌元件程式碼。

  • vprintf 無法從使用 /clr 編譯的程式呼叫函 式。

  • 修飾 naked__declspec 詞會在 下 /clr 忽略。

  • _set_se_translator 設定的翻譯工具函式只會影響 Unmanaged 程式碼中的 catch。 如需詳細資訊,請參閱 例外狀況處理

  • 不允許在 下 /clr 比較函式指標。

  • 不允許使用 /clr 未完全建立原型的函式。

  • 不支援下列編譯器選項 /clr

  • 不支援預處理器定義 ( /D_STATIC_CPPLIB ) 和 /clr 編譯器選項的組合 _STATIC_CPPLIB 。 這是因為定義會導致您的應用程式與不支援的靜態多執行緒 C++ 標準程式庫連結。 如需詳細資訊,請參閱 /MD/MT/LD (使用執行時間程式庫)。

  • 當您搭配 /clr 使用 /Zi 時,會有效能影響。 如需詳細資訊,請參閱/Zi

  • 將寬字元傳遞至 .NET Framework 輸出常式,而不指定 /Zc:wchar_t 或未將字元 _wchar_t 轉換成 ,會導致輸出顯示為 unsigned short int 。 例如:

    Console::WriteLine(L' ')              // Will output 32.
    Console::WriteLine((__wchar_t)L' ')   // Will output a space.
    
  • /GS 使用 編譯 /clr 時會忽略 ,除非函式位於 或 函式必須 #pragma unmanaged 編譯為機器碼,在此情況下,編譯器會產生預設關閉的警告 C4793。

  • 如需受控應用程式的函式簽章需求,請參閱 /ENTRY

  • 使用 /openmp/clr 編譯的應用程式只能在單一 appdomain 進程中執行。 如需詳細資訊,請參閱 /openmp (啟用 OpenMP 2.0 支援)。

  • 若函式接受可變數目的引數 (varargs),該函式會產生為原生函式。 變數引數位置中的任何受控資料類型都會封送處理為原生類型。 任何 System.String 類型實際上是寬字元字串,但會封送處理為單一位元組字元字串。 因此, printf 如果規範是 %Swchar_t* ),它會改為封送處理至 %s 字串。

  • 使用 va_arg 宏時,使用 編譯 /clr:pure 時可能會取得非預期的結果。 如需詳細資訊,請參閱 、 、 va_copyva_endva_startva_arg /clr:pure/clr:safe 編譯器選項在 Visual Studio 2015 中已被取代,Visual Studio 2017 和更新版本中不支援。 必須是「純」或「安全」程式碼才能移植到 C#。

  • 您不應該呼叫任何會逐步執行堆疊的函式,以從 Managed 程式碼取得參數資訊(函式引數)。 P/Invoke 層會使該資訊進一步向下堆疊。 例如,請勿使用 /clr 編譯 Proxy/存根。

  • 函式會盡可能編譯為受控程式碼,但並非所有 C++ 建構都可以轉譯成受控程式碼。 這會以每個函式為基礎來做出決定。 如果函式的任何部分無法轉換成 Managed 程式碼,則整個函式會改為轉換成機器碼。 下列情況會阻止編譯器產生受控程式碼。

    • 編譯器產生的 Thunk 或協助程式函式。 透過函式指標進行的任何函式呼叫 (包括虛擬函式呼叫) 都會產生原生 Thunk。

    • 呼叫 setjmplongjmp 的函式。

    • 使用特定內建常式來直接操作機器資源的函式。 例如,使用 __enable__disable_ReturnAddress_AddressOfReturnAddress 或多媒體內建項目,都會導致機器碼。

    • 遵循 #pragma unmanaged 指示詞的函式。 (反, #pragma managed ,也得到支援。

    • 包含對齊類型參考的函式,這些類型是指使用 __declspec(align(...)) 宣告的類型。

另請參閱