在C ++ / CLI中是否存在C#的不安全等价物?

时间:2011-07-22 15:29:21

标签: c# .net visual-c++ c++-cli

我正在尝试将C ++ / CLI代码移植到可验证的Type-Safe C ++ / CLI代码中(使用clr:safe标志),这样我就可以获得AnyCPU程序集。 我发现的主要编译问题是,我得到了很多C4956错误,我想,这可能是通过明确地告诉编译器我希望这是不安全的。 建议?

4 个答案:

答案 0 :(得分:2)

将不安全的代码从C#移植到CLI时不应该有很多问题,只需确保使用IntPtr这是符合CLS的架构无关指针。

如果遇到特定问题或者您对某些内容不确定,请更新详细信息。

答案 1 :(得分:2)

C ++ / CLI可以与C ++代码自由混合,并且本质上是不安全的,因此除了语言本身之外没有其他等价物。使用pin_ptr固定垃圾收集的对象和缓冲区,现在你有一个C ++样式指针可供使用。你也可以在这样的指针上使用C ++ STL,不安全的强制转换等。

答案 2 :(得分:2)

已涵盖here

基本上,这是/clr:pure应该提供的内容,因为它还会生成纯MSIL程序集。不幸的是,它仍然会导致对特定位数的依赖,因此与AnyCPU不兼容。

答案 3 :(得分:1)

关于回答这个问题的参考,我们有:

/ clr:safe创建仅MSIL的可验证程序集。您不能拥有本机类型 代码,如果您尝试使用它们,编译器将抛出错误。这个汇编 mode生成的程序集等同于C#(常规模式) 和VB.NET会产生。

为了使用类型安全的代码,你需要使用句柄(使用gcnew)而不是指针(使用new)

此外,safe_cast运算符是C ++ / CLI的新手,并取代了__try_cast 旧的语法。 safe_cast保证生成可验证的MSIL。您 可以在任何通常使用dynamic_cast的地方使用safe_cast, reinterpret_cast或static_cast。在运行时,safe_cast检查 看看演员表是否有效

你应该抓一份:C++/CLI in Action by Nishant Sivakumar 非常好的C ++ / CLI参考