HOW TO:移轉至 /clr:safe (C++/CLI)
Visual C++ 可使用 /clr:safe 產生可驗證的元件,這會使編譯器對每一個不可驗證的程式碼建構都產生錯誤。
備註
下列問題會產生可驗證性的錯誤:
原生 (Native) 型別。 就算不使用,原生類別 (Class)、結構、指標或陣列的宣告也會妨礙編譯。
全域變數
任何會進入 Unmanaged 程式庫的函式呼叫,包括 Common Language Runtime 的函式呼叫。
可驗證的函式不能包含用於向下轉型 (Down Casting) 的 static_cast Operator。 static_cast Operator 可以用來在基本型別 (Primitive Type) 之間轉型,但是向下轉型則必須使用 safe_cast 或 C-Style 轉型 (實作為 safe_cast)。
可驗證的函式不能包含 reinterpret_cast Operator (或任何 C-style 轉型的對等用法)。
可驗證的函式不能在 interior_ptr 上進行演算。 它可能僅指派並取消參考。
可驗證的函式只能擲回或攔截參考型別 (Reference Type) 的指標,所以實值型別 (Value Type) 在擲回之前必須先進行 Box 處理。
可驗證的函式只能呼叫可驗證的函式 (這樣就不允許呼叫 Common Language Runtime,其中包括 AtEntryAtExit,因此不允許全域建構函式)。
可驗證的類別不能使用 Explicit。
如果是建置 EXE,則 main 函式不能宣告任何參數,所以必須使用 GetCommandLineArgs 來擷取命令列引數。
對虛擬函式 (Virtual Function) 進行非虛擬呼叫。 例如:
// not_verifiable.cpp // compile with: /clr ref struct A { virtual void Test() {} }; ref struct B : A {}; int main() { B^ b1 = gcnew B; b1->A::Test(); // Non-virtual call to virtual function }
此外,請勿在可驗證程式碼中使用下列關鍵字: