C ++ / CLI有什么意义?

时间:2010-03-10 00:05:50

标签: .net c++-cli

我想知道C ++ / CLI的用途是什么。在我看来,它基本上是在.Net上运行的C ++,我在这个想法中错了吗?到底有什么好处呢?为什么不使用C#或其他一些真正的托管语言呢?

4 个答案:

答案 0 :(得分:11)

C ++ / CLI有几个优点,而不仅仅是C ++或C#

  • 这是一种很好的语言,用于编写在本机代码和托管代码之间进行交互的大型组件。
  • 提供从本机C ++代码库到托管代码库的快速(呃)转换路径。如果没有C ++ / CLI,最好的选择就是重写

答案 1 :(得分:10)

C ++ / CLI有一些C#没有的有趣内容:

  • 强力拳击。如果您在C#中将int打包到object,则会丢失有关原始类型的信息。不是C ++ / CLI中的情况。

  • 析构函数和终结符之间的区别。在C#中,您必须手动实施IDisposable并记得致电Dispose。在C ++ / CLI中,您只需将清理代码放入析构函数中(它会自动编译成Dispose方法),并将仅托管清理代码放入终结器中。

  • 变量的堆栈和堆语义之间的区别。 Stack是默认值,堆栈分配的引用类型将自动被销毁(处置) - 您不必记住delete它们,只是让它们超出范围。总而言之,在C ++ / CLI中处理非托管资源比使用任何其他.NET语言要容易得多。

  • 函数指针。现在这与C#中的匿名委托和lambda语法没什么区别,但是在2005年这是一件大事。

  • 访问CLR中实施的所有访问修饰符。您可以为同一个程序集外部程序集明确指定public,protected或private。 C#中的所有内容(明显的publicprotectedprivate除外)都是internalprotected internal修饰符,前者意为“公共内部,私人外部“和后者意味着”公共内部,外部保护“。在C ++中,您可以将类设置为“protected AND internal”,这意味着该成员只能在相同程序集中的派生类中访问。

  • 价值类。很奇怪,但可能对某人有用!

对所有这些以及更多here有更详细的解释。总而言之,其他托管语言--C#,VB.NET,F#等 - 实际上并不能让您完全访问CLR可以执行的所有操作,更像是其中的90%。 C ++ / CLI允许您在CLR规范中执行您想要的任何操作。

答案 2 :(得分:4)

C ++ / CLI的几个原因:

  • 它允许以比其他.NET语言更精细的级别集成/混合托管代码和非托管代码
  • 托管C ++并不是特别成功; C ++ / CLI试图使.NET范例更好地适应现有的C ++习语
  • 虽然我认为没有人认为它会在人气方面超过C#,但我想有些人认为它会比现在有更高的成功率。然而,就我所知,它非常成功。除了玩具之外,我没有做过任何事情 - 但是当Visual C++ Team Blog表示VS2010 wouldn't have IntelliSense for C++/CLI时,有一点风暴的推迟。远远超出我的预期(我不确定MS的预期)。

微软确实在C ++ / CLI中做了一些我觉得很有意思的事情,即使你对.NET不感兴趣:他们处理以对现有C ++影响最小的方式添加新关键字的方式

  • 多字(或“间隔”)关键字(我认为此技术已获得专利或正在申请专利)
  • 上下文关键字
  • 'namespaced'keywords

有关详细信息,请参阅Sutter's article

答案 3 :(得分:2)

天哪,当你需要做一些高性能的事情(例如用SIMD进行图像处理),与原生C ++(例如OpenGL代码,现有的遗留C ++代码)互操作或者看起来很聪明时,我已经使用了C ++ / CLI加载。

ok;)也许不是最后一个

放弃对它的支持将是一个巨大的损失IMO ..