方法: /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) 上で数値型を実行できません。可能なのは、代入と逆参照だけです。
検証可能な関数は、参照型へのポインターだけをスローまたはキャッチします。このため、値型はスローする前にボックス化する必要があります。
検証可能な関数は、検証可能な関数しか呼び出すことができません。AtEntry や AtExit を含む共通言語ランタイムの呼び出しが許可されないため、グローバル コンストラクターも使用できません。
検証可能なクラスは、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 }
また、次のキーワードは検証可能なコードで使用できません。