使用C++/CLI而不是C#的情况或利弊是什么

Bre*_*len 8 .net c# clr c++-cli

我一直在跟上.NET CLR一段时间,而我选择的语言是C#.

直到最近,我还没有意识到C++/CLI可以生成能够运行本机和托管代码的"混合模式"可执行文件.

现在知道这一点,我的另一位开发人员朋友正在讨论这个属性,并试图确定这种能力何时以及如何有用.

我认为本机代码具有比托管代码更高效和更强大的能力,但代价是额外的开发时间.

在过去,我使用严格的本机C++代码库,并使用Interop来利用我写入本机库的功能.

我可以看到不需要额外库的好处,但我很好奇使用C++/CLI在C#中创建的soley托管可执行文件的所有优点/缺点,或使用Interop调用纯本机C++的可执行文件图书馆?

(旁注:Interop/PInvoke这两个术语是否可以互换,因为我不明白这些术语之间的区别,只是看到它们使用相同的方式.)

phi*_*red 13

使用C++/CLI,您可以广泛地创建三种类型的对象:

  1. 托管类型.这些将编译为与等效C#基本相同的IL.这里没有表演机会.
  2. 原生类型.编译为本机代码,就像使用直接C++一样.
  3. 混合模式类型.这些编译为托管代码,但也允许您引用本机类型.

您可能会认为(3)就像使用PInvoke代码编写C#代码来访问本机内容 - 除了为您生成所有PInvoke内容.

当然,还有更多内容,以及一些注意事项 - 但这应该会让你知道它是如何有用的.

换句话说,它真的是一种粘合语言.虽然您可以在C++/CLI中编写完全成熟的应用程序,但将托管和本机部分分开并使用C++/CLI将这两个部分与PInvoke更加干净地连接起来更为常见.

另一个常见用途是使用.Net库调用扩展和现有的本机C++代码库.

请注意,您要对代码进行分区,因为在将纯C++代码透明地编译为IL时,它可能会非常微妙!

至于你的旁注:PInvoke是一种特殊类型的Interop.Interop也有其他形式,例如COM Interop.事实上,更准确地说,PInvoke是一组语言功能,使Interop与本机代码更容易.

  • 请记住,如果您打算将包装器移植到Mono,除非完全管理,否则不能使用C++/CLI.Mono不支持C++/CLI中的非托管代码.这就是为什么我总是坚持P/Invoke,如果可以的话. (4认同)
  • +1称其为胶水语言.C++/CLI的最佳描述. (2认同)