共用方式為


HOW TO:移轉至 /clr:safe (C++/CLI)

Visual C++ 可使用 /clr:safe 產生可驗證的元件,這會使編譯器對每一個不可驗證的程式碼建構都產生錯誤。

備註

下列問題會產生可驗證性的錯誤:

  • 原生 (Native) 型別。 就算不使用,原生類別 (Class)、結構、指標或陣列的宣告也會妨礙編譯。

  • 全域變數

  • 任何會進入 Unmanaged 程式庫的函式呼叫,包括 Common Language Runtime 的函式呼叫。

  • 可驗證的函式不能包含用於向下轉型 (Down Casting) 的 static_cast 運算子static_cast 運算子 可以用來在基本型別 (Primitive Type) 之間轉型,但是向下轉型則必須使用 safe_cast (C++ 元件擴充功能) 或 C-Style 轉型 (實作為 safe_cast (C++ 元件擴充功能))。

  • 可驗證的函式不能包含 reinterpret_cast 運算子 (或任何 C-style 轉型的對等用法)。

  • 可驗證的函式不能在 interior_ptr (C++/CLI) 上進行演算。 它可能僅指派並取消參考。

  • 可驗證的函式只能擲回或攔截參考型別 (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
    }
    

此外,請勿在可驗證程式碼中使用下列關鍵字:

請參閱

參考

純粹的和可驗證的程式碼 (C++/CLI)