C ++ / CLI:我为什么要使用它?
我对C ++非常熟悉,所以我考虑学习.NET及其所有派生(尤其是C#)。
一路上我碰到了C ++ / CLI,我想知道这个语言是否有特定用途? 它只是假设成为从本地C ++转换到C#的中间语言?
另外一个问题就是为什么.NET框架中还有这么多的编程语言? (VB,C ++ / CLI,C#…)
是的,C ++ / CLI具有非常特定的目标用法,语言(及其编译器,最重要的是)使编写需要与非托pipe代码互操作的代码变得非常容易。 它内置了对托pipetypes和非托pipetypes之间编组的支持。 它曾经被称为IJW(It Just Works),现在叫做C ++ Interop。 其他语言需要使用P / Invoke编组器,与C ++ / CLI的function相比,它可能效率低下,function有限。
如果您需要与本地C ++进行互操作,那些具有实例function并需要新关键字和删除关键字来创build/销毁类实例的类,那么您别无select,只能使用C ++ / CLI。 Pinvoke无法做到这一点,只有C ++编译器知道分配多less内存,以及如何正确thunk该实例函数的指针。
.NET框架包含用C ++ / CLI编写的代码,特别是在System.Data和WPF的PresentationCore中。 如果您没有非托pipe的互操作性需求,或者不需要使用遗留代码库,那么selectC ++ / CLI的原因很less。 C#或VB.NET是更好的select。 C ++ / CLI的function集在2005年左右被冻结,它不支持更多的新增function,如lambda或Linq语法。 IDE也不支持C#和VB.NET集成开发环境中的许多function。 值得注意的是,VS2010最初将不提供对C ++ / CLI的IntelliSense支持。 那里有一点点的死亡之吻。
更新:在VS2012恢复,智能感知支持又回来了。 C ++ / CX是一种语言扩展,它简化了用C ++编写WinRT应用程序的过程。 它的语法与C ++ / CLI非常相似。 Windows窗体项目模板已被删除,但devise师仍然工作。 VS2012中的新debugging引擎不支持C ++ / CLI,您必须打开Tools + Options,Debugging,General中的“Managed Compatibility Mode”选项。
第一个C#不是.NET的“派生”。 .NET不是一种语言,它是一个基于CLR的应用程序框架和类库,有许多语言存在。
也就是说,使用.NET最引人注目的原因是它是一个devise良好的类库,比Win32或MFC更容易开发Windows。 然而,我个人决定,我宁愿学习一种新的语言,而不是学习一个新的语言的扩展,因为C#是从头开始devise与.NET的工作,我build议这是.NET的select语言。
C ++ / CLI非常有用,您希望将.NET用于一些遗留代码,而且我已经使用它来创buildWindows窗体GUI,并将它们粘贴到现有的应用程序代码中。 它的另一个理由是它是唯一一个在单个加载模块中支持混合托pipe代码和本地代码的.NET语言,所以它对于遗留代码的性能和重用都是有利的。
就语言的数量而言,微软希望每个Windows应用程序都基于.NET,因为它更适合其操作系统的安全性和稳定性。 唯一的办法就是支持多种语言。 把.NET看作是一个应用程序平台或者操作系统API,然后这个问题变得不那么重要。 因为任何平台上都有很多种语言,所以.NET会有很多种语言。 那些原因很多,包括商业优势,应用合适,政治,支持现有的开发者,select和毋庸置疑。
微软几次改变了立场。 它原本是作为一个完整的语言,基本上他们希望所有的本地开发者转向,尽可能地放弃原生C ++。
然后在几年前,他们意识到,这根本不是他们的客户想要的。 无论如何,迁移到.NET的开发人员通常会跳转到像C#这样的语言,而其他人有理由将其代码保留在原生世界中,所以他们仍然使用C ++。
所以现在,微软希望C ++ / CLI成为本地C ++代码和以某种.NET语言编写的托pipe代码之间的“桥梁”。 这不再是一种语言,他们build议你切换你的整个代码库。
它确实主要是作为中间语言来轻松地将.net代码与原生的非托pipeC ++链接起来。 帮你一个忙,不要用,如果你不需要。 C ++ / CLI语法是一团糟。
关于你的第二个问题……我想今天C#是.net的主stream语言,但不是每个人都喜欢它的风格和范式。 .net的体系结构使添加新语言变得容易(请参阅F#,它针对函数式编程)。
我已经使用C ++ / CLI为一些非托pipeC ++库创build.NET API。 参数的传递和编组需要一些习惯(取决于使用的types),但是一旦你掌握了这个参数,这是弥合托pipe和非托pipe世界之间差距的一个很好的方法。
我没有看过C ++ / CLI,但它利用了.NET世界 – 把它看作是一个介于C ++和C#之间的世界。 在想要使用可以轻松访问.NET对象的C ++及其核心BCL的情况下,这可能会很有用。 看看这篇文章,讨论C ++ / CLI的引用。 不幸的是,我还没有听说过Managed C ++应用程序,因为它在事物的语法方面触发了很多C ++的朋友,并失去了追随者回到非托pipe的C ++世界的聚会。
希望这有助于,最好的问候,汤姆。
对于我来说,我不得不使用它,当没有其他的方式来重用c ++类
就这样你知道。 除非您将代码指定为非托pipe编译,否则在编译CLR支持时将编译为托pipe代码。
而CLI C ++很好。 我觉得编码是一种痛苦。只是有一点让我不想编程。 这甚至不是“^”。 这就像使用一个破碎的.net。 我花了40分钟编写完全托pipe的东西,花了我10分钟的C#。 我的意思是,有时我只是放弃和使用C#,因为它编码时让我感到沮丧。 我的意思是,如果你打算使用.NET,你可以使用C#(通过CLI C ++)。