C# 是否有一个C&x27;s在C+中的不安全等价物+/CLI?

C# 是否有一个C&x27;s在C+中的不安全等价物+/CLI?,c#,.net,visual-c++,c++-cli,C#,.net,Visual C++,C++ Cli,我正在尝试将C++/CLI代码移植到可验证的类型安全的C++/CLI代码(使用clr:Safe标志),以便获得AnyCPU程序集。 我发现的主要编译问题是,我得到了很多C4956错误,我认为,可以通过显式地告诉编译器我认为这是不安全的来解决。 建议?将不安全代码从C#移植到CLI时不应该有很多问题,只要确保使用符合CLS的体系结构无关指针即可 如果你遇到了一些问题或者你对某事不确定,请用更详细的信息更新问题。 C++ +CLI可以自由地与C++代码混合,本质上是不安全的,所以除了语言本身外没有其

我正在尝试将C++/CLI代码移植到可验证的类型安全的C++/CLI代码(使用clr:Safe标志),以便获得AnyCPU程序集。 我发现的主要编译问题是,我得到了很多C4956错误,我认为,可以通过显式地告诉编译器我认为这是不安全的来解决。
建议?

将不安全代码从C#移植到CLI时不应该有很多问题,只要确保使用符合CLS的体系结构无关指针即可


<>如果你遇到了一些问题或者你对某事不确定,请用更详细的信息更新问题。

C++ +CLI可以自由地与C++代码混合,本质上是不安全的,所以除了语言本身外没有其他等价的需要。使用PixPTR来压缩垃圾收集的对象和缓冲区,现在您有一个C++样式指针使用。你也可以在这些指针上使用C++ STL、不安全的转换等等。 /clr:safe创建仅限MSIL的可验证程序集。您的中不能有本机类型 如果您试图使用它们,编译器将抛出一个错误。本汇编 模式生成与C#(常规模式)等效的程序集 而VB.NET将产生

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

此外,safe_cast操作符是C++/CLI的新成员,它取代了u try_cast-in 旧语法。safe_cast保证生成可验证的MSIL。你 可以在通常使用动态强制转换的地方使用安全强制转换, 重新解释\u cast或静态\u cast。在运行时,safe_强制执行检查 查看强制转换是否有效

您应抓取以下文件的副本: 非常好的C++/CLI参考资料

已经介绍过了


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

不兼容整个语言几乎完全相同…我无法使用C++\CLI,但除非使用\uu gc directive,否则无法管理语言本身,如果我没弄错的话。@BoldClock:我想他是指/clr:pure-请原谅我的困惑,我更新了一点我的问题@shf301:我的意思是/clr:safe,因此它将生成一个仅MSIL的程序集。我只是想澄清一下,我认为你的意思是警告,而不是错误。当然,你应该已经在C#中使用
IntPtr
,所以我不确定更改在哪里。@Cody我意识到,这就是为什么一般的答案是“由于不安全代码块的限制,您不应该有任何问题”,假设他使用的是IntPtr,而不是类似“inta=4”;(*(int*)&a)=1;“…这是一个显而易见的问题,但这是一个相当模糊的问题。这不是一个批评;看起来你只是在暗示,
IntPtr
不会在C#中使用。我同意移植代码应该不会有任何问题。
safe_cast
只是
静态_cast
的替代品,肯定不是
动态_cast。”。他使用的是
/clr:safe
编译器选项,这阻止了使用大多数这些功能。他在我的回答后补充说。无论如何,他可以用#pragma解决这个问题。事实上,MSIL不兼容的代码并没有什么(除非调用interop);而是各种库(MFC、ATL、CRT)这会导致问题。如果您愿意不使用这些(以及互操作),您可以使用C++/CLI AnyCPU/clr:pure模块。没问题。请参阅@GlennSlayden:正如您在回答中提到的,编译器和链接器仍然会生成具有锁定位的程序集。无法使编译器生成不安全的AnyCPU程序集,您需要像
corflags
这样的外部工具。