/clr
限制
請注意使用 的下列限制 /clr
:
在結構化例外狀況處理程式中,使用 編譯
/clr
時會限制使用_alloca
。 如需詳細資訊,請參閱_alloca
。使用運行時間錯誤檢查對 無效
/clr
。 如需詳細資訊,請參閱 如何:使用原生運行時間檢查。當
/clr
用來編譯只使用標準C++語法的程式時,下列指導方針適用於使用內嵌元件:對於假設具有原生堆疊配置、目前函式外呼叫慣例或其他電腦相關低階資訊認知的內嵌組件程式碼,如果該認知套用到受控函式的堆疊框架,則內嵌組件程式碼可能會失敗。 包含內嵌元件程式代碼的函式會以 Unmanaged 函式的形式產生,就像它們放在未
/clr
編譯的個別模組中一樣。不支援傳遞複製建構函式參數之函式中的內嵌元件程式代碼。
修飾
naked
__declspec
詞會在下/clr
忽略。所
_set_se_translator
設定的翻譯工具函式只會影響 Unmanaged 程式代碼中的 catch。 如需詳細資訊,請參閱 例外狀況處理。不允許在下
/clr
比較函式指標。不允許使用
/clr
未完全建立原型的函式。不支援下列編譯程序選項
/clr
:/EHsc
和/EHs
(/clr
暗示/EHa
(請參閱/EH
(例外狀況處理模型)/fp:strict
和/fp:except
(請參閱/fp
指定浮點行為)
不支援預處理器定義 (
/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
如果規範是%S
(wchar_t*
),它會改為封送處理至%s
字串。使用
va_arg
巨集時,使用 編譯/clr:pure
時可能會取得非預期的結果。 如需詳細資訊,請參閱 、 、va_copy
va_end
va_start
。va_arg
/clr:pure
和/clr:safe
編譯程式選項在Visual Studio 2015中已被取代,Visual Studio 2017 和更新版本中不支援。 必須是「純」或「安全」程式碼才能移植到 C#。您不應該呼叫任何會逐步執行堆疊的函式,以從Managed程式碼取得參數資訊(函式自變數)。 P/Invoke 層會使該資訊進一步向下堆棧。 例如,請勿使用
/clr
編譯 Proxy/存根。函式會盡可能編譯為受控程式碼,但並非所有 C++ 建構都可以轉譯成受控程式碼。 這會以每個函式為基礎來做出決定。 如果函式的任何部分無法轉換成 Managed 程式代碼,則整個函式會改為轉換成機器碼。 下列情況會阻止編譯器產生受控程式碼。
編譯器產生的 Thunk 或協助程式函式。 透過函式指標進行的任何函式呼叫 (包括虛擬函式呼叫) 都會產生原生 Thunk。
呼叫
setjmp
或longjmp
的函式。使用特定內建常式來直接操作機器資源的函式。 例如,使用
__enable
和__disable
、_ReturnAddress
和_AddressOfReturnAddress
或多媒體內建項目,都會導致機器碼。遵循
#pragma unmanaged
指示詞的函式。 (反,#pragma managed
,也得到支援。包含對齊類型參考的函式,這些類型是指使用
__declspec(align(...))
宣告的類型。