如何:迁移到 /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,则主函数不能声明任何参数,因此必须使用 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 }
同样,在可验证代码中不能使用下面的关键字: