我正在尝试编写与操作系统以及Active Directory和Ocropus等内容的集成。
我知道一堆编程语言,包括标题中列出的语言。我正在努力学习 C ++ / CLI的工作原理,但无法通过我在线搜索找到简洁,准确和准确的描述。所以我在这里问。
你能告诉我C ++ / CLI的缺陷和特点吗?假设我知道所有C#并从那里开始。我不是C ++的专家,所以我的一些问题的答案可能“就像C ++”,但可以说我在C#。我想知道的事情:
注意:我真的在问C ++ / CLI的特点,它的陷阱。
答案 0 :(得分:5)
首先,你将现在已经不存在的“带有__gc和__nogc关键字的C ++管理扩展”与新的和当前支持的C ++ / CLI语言相混淆,它最终提供了指针之间的正确区分(本机)和句柄(托管对象,它们实际上是作为指向.NET对象所在的垃圾收集内存的指针实现的,但你不应该将它们视为指针,因为它们会被垃圾收集器自动调整)。两种类型的指针是完全不同的,只有内置类型与两者兼容,然后你只需将它们打包以获得句柄。您永远不会有一个指向托管堆外部的句柄,并且您只能在pin_ptr生存期(仅限本地作用域)的持续时间内获得一个本机指针到托管堆中。托管类可以保存指向本机内存的指针,就像C#可以拥有IntPtr成员一样。本机类型可以使用gcroot模板类型保存托管对象的句柄,该类型包装System :: GCHandle。
Microsoft C ++ / CLI编译器能够生成纯MSIL或MSIL和本机代码的混合,具体取决于您使用/ clr还是/ clr:pure还是/ clr:safe(最后限制/ clr:pure只产生可验证的MSIL)。大多数其他问题的答案取决于它所处的模式中的哪一种。例如,它生成的任何MSIL都将在Mono上运行,但混合本机和MSIL不会,因为它依赖于Microsoft .NET运行时的内部
任何限制仅适用于使用C ++ / CLI创建的托管类型(例如,ref class,enum类)。本机类型,即使在编译为纯MSIL时,也具有C ++语言的完全灵活性,包括多重继承,模板等。
C ++ / CLI捕获本机代码和托管代码中的托管异常类型(/ clr强制/ EHa编译器选项)。
C ++ / CLI提供了一个堆栈语义语法(声明一个类型不包含^ suffix含义句柄的变量)。这对于局部变量和托管类型的成员都是可能的。编译器将自动生成对IDisposable :: Dispose的调用,用于在所有常用位置实现它的类型(如C#using block for local variables,自动在托管类型中创建一个IDisposable实现,在所有成员上调用Dispose)。
Lambdas尚不可用,因为在下一版本的Visual Studio(2010)中,它们将使用即将推出的C ++标准定义的语法添加。
无论您使用何种编译器,都无法在内核模式下运行托管代码,C ++ / CLI在此区域内不会发生任何变化。
对于一个问题,你真的有太多要点。如果你真的希望我完成我的每一个观点,但它将是一系列的博客文章,我将在这里留下一个链接。
答案 1 :(得分:5)
将C ++指针转换为CLI指针
CLI类型不必是指针。在C ++ / CLI中使用句柄(^)。
路过的任何差异 值/双向间接指针/ CLI 来自C#/ C ++的指针是什么 '推荐'。
如果您需要与C#更好的互操作性,请避免使用指针。使用C ++ / CLI中所有与指针相关的东西,并仅公开托管类型,以便C#应用程序可以轻松使用它。
“固定”关键字;那存在吗?
pin_ptr<>
是等价的。
终结者(~ClassName(){})是 在C#中气馁,因为没有 他们会跑步的garantuees 确定性地,但因为在C ++中我 必须使用“删除”或使用 copy-c'tors to stack allocation 记忆,有什么建议 在C#/ C ++交互之间?
C ++ / CLI支持确定性资源管理。编写析构函数时,编译器将在类上实现IDisposable
接口,并将析构函数转换为Dispose()
方法。 delete将调用此Dispose()
来执行资源取消分配。因此,您在使用C#时没有遇到任何问题。您可以将用法包装在C#中的using
语句中,这将确保调用Dispose
。
C ++中的属性类似于 C#中的属性?
是的,他们是相似的。
我可以使用完整的元编程吗? C ++中可用的模式 模板现在仍然有它 像普通的C ++一样编译?
是。 C ++ / CLI支持ref类的模板。您可以像使用标准C ++一样使用元编程技术。但是这些不能移植到C#。
您是否尝试过编写C ++ / CLI? 提升?
C ++ / CLI可以访问整个.NET框架。我不认为助推在这里有多大帮助。