我正在尝试将C++/CLI代码移植到可验证的类型安全的C++/CLI代码(使用clr:safe标志),以便可以得到一个AnyCPU程序集。 我遇到的主要编译问题是,我得到了很多C4956错误,我认为可以通过明确告诉编译器我希望它是不安全的来解决这个问题。 有什么建议吗?
我正在尝试将C++/CLI代码移植到可验证的类型安全的C++/CLI代码(使用clr:safe标志),以便可以得到一个AnyCPU程序集。 我遇到的主要编译问题是,我得到了很多C4956错误,我认为可以通过明确告诉编译器我希望它是不安全的来解决这个问题。 有什么建议吗?
将不安全的C#代码移植到CLI应该不会遇到太多问题,只要确保使用IntPtr,这是一个符合CLS标准且架构无关的指针。
如果您遇到特定的问题或对某些事情不确定,请更新问题并提供更多细节。
IntPtr
了,所以我不太确定这个变化在哪里。 - Cody GrayIntPtr
在 C# 中不会被使用。我同意几乎没有问题移植代码。 - Cody GrayC++/CLI 可以自由地与 C++ 代码混合使用,本质上是不安全的,因此除了语言本身之外,不需要其他等效物。使用 pin_ptr 固定垃圾回收对象和缓冲区,现在您可以使用类似于 C++ 的指针。您还可以在这些指针上使用 C++ STL、不安全转换等。
/clr:safe
编译器选项,这会防止使用大多数这些功能。 - Ben Voigt这个已经在这里有讨论。
基本上,/clr:pure
应该提供的是这个,因为它也会生成一个纯的MSIL程序集。不幸的是,它仍然会导致与特定位数的依赖性,因此不兼容AnyCPU
。
关于回答这个问题,我们提供以下参考:
/clr:safe 创建一个仅包含 MSIL 的可验证程序集。您的代码中不能有本地类型,如果尝试使用它们,编译器将抛出错误。此编译模式生成的程序集与 C#(常规模式)和 VB.NET 生成的程序集相同。
为了使用类型安全的代码,您需要使用句柄(使用 gcnew)而不是指针(使用 new)
此外,safe_cast 运算符是 C++/CLI 中的新内容,取代了旧语法中的 __try_cast。safe_cast 保证产生可验证的 MSIL。您可以在通常使用 dynamic_cast、reinterpret_cast 或 static_cast 的任何地方使用 safe_cast。在运行时,safe_cast 检查转换是否有效
您应该获取一份:C++/CLI in Action by Nishant Sivakumar非常好的 C++/CLI 参考资料
safe_cast
只是 static_cast
的替代品,绝对不能替代 dynamic_cast
。 - ildjarn