次の方法で共有


方法: /clr:safe に移行する (C++/CLI)

Visual C++ では、/clr:safe を使用して検証可能なコンポーネントを生成できます。この場合、コンパイラは、検証可能でないコード コンストラクターを検出するたびにエラーを生成します。

解説

次の問題により、検証可能性エラーが生成されます。

  • ネイティブ型。 ネイティブ型を使用していない場合でも、ネイティブ クラス、構造体、ポインター、または配列の宣言によりコンパイルできなくなります。

  • グローバル変数

  • 共通言語ランタイム関数呼び出しなどの任意のアンマネージ ライブラリへの関数呼び出し

  • 検証可能な関数には、ダウンキャストのために static_cast 演算子 を含めることはできません。 プリミティブ型どうしのキャストには、static_cast 演算子 を使用できますが、ダウンキャストには、safe_cast (C++ コンポーネント拡張) または C スタイルのキャスト (これは、safe_cast (C++ コンポーネント拡張) として実装される) を使用する必要があります。

  • 検証可能な関数には、reinterpret_cast 演算子 (または同等の C スタイル キャスト) を含めることができません。

  • 検証可能な関数は、interior_ptr (C++/CLI) 上で数値型を実行できません。 可能なのは、代入と逆参照だけです。

  • 検証可能な関数は、参照型へのポインターだけをスローまたはキャッチします。このため、値型はスローする前にボックス化する必要があります。

  • 検証可能な関数は、検証可能な関数しか呼び出すことができません。AtEntryAtExit を含む共通言語ランタイムの呼び出しが許可されないため、グローバル コンストラクターも使用できません。

  • 検証可能なクラスは、Explicit を使用できません。

  • EXE をビルドする場合、main 関数はパラメーターを宣言できないため、GetCommandLineArgs を使用してコマンド ライン引数を取得する必要があります。

  • 仮想関数への非仮想呼び出しを行います。 たとえば、次のようになります。

    // 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)