【问题标题】:C++/CLI Native or Managed?C++/CLI 本机还是托管?
【发布时间】:2016-03-16 17:33:36
【问题描述】:

我有一个 C# 项目,我需要一个 C++ 本机代码来与 C# 代码交互。为此,我使用了一个将调用 C++ 类的 C++/CLI 类包装器。

据我了解,如果 C++ 类的声明后面有 ref,它将被编译为托管代码。如果它没有它,它将被编译为原生代码。

这个假设是正确的还是我需要给编译器进一步的指令来确保我的类是本地代码?

【问题讨论】:

  • “如果一个 C++ 类有一个引用......它将被编译为托管代码” - 不确定。 c++/CLI ref class 可以包含本机和 CLI 类型。例如一个ref class,其中有一个void* 指针。 blogs.msdn.com/b/abhinaba/archive/2012/11/14/…
  • 有人想指出为什么 -1 投票吗?
  • 可能是愤怒的 C++ 编码人员强调“我应该如何知道删除的脏话?这不是 C++ 问题。” C++ 中没有 ref 这样的东西。
  • 我问了一个标题和标签 c++/cli 的问题,所以它涵盖了语言和 ref 修饰符
  • 我会阅读那篇文章,谢谢@Micky

标签: c++-cli mixed-mode


【解决方案1】:

据我了解,如果 C++ 类的声明后面有 ref,它将被编译为托管代码。

正确。没有/clrref class 类型无法编译。

如果没有,它会被编译为原生代码。

不正确。如果/clr 有效(例如,未被#pragma unmanaged 禁用),则编译器仅生成 MSIL(Microsoft 中间语言,.NET 的字节码)。

【讨论】:

  • 但是我从里面调用 c++ 库...我假设如果代码能够与本机库交互,它应该是本机的...所以我猜 MSIL 正在包装这些函数调用?
  • “如果 /clr 生效……那么编译器只会生成 MSIL” - 你的意思是 /clr:pure 吗? msdn.microsoft.com/en-us/library/k8d11d4s.aspx
  • 大多数幼稚操作都有 MSIL 版本。并不总是那么高效,但仍然有效。
  • @Micky:本机(非 MSIL)机器代码有两个潜在来源,它们会导致生成混合模式程序集:项目中的代码和链接的静态库。虽然我知道编译器在少数情况下即使使用/clr 也会生成本机机器代码,但使用/clr:pure 更多的是控制链接而不是代码生成。
  • @mFeinstein:通过直接内存操作,与在 C# 中使用 /unsafe 中的指针几乎相同
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 2011-04-30
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多