简要介绍C#/ Haskell / F#/ JS / C ++ / ...程序员的C ++ / CLI

时间:2010-03-08 01:29:48

标签: c# c++-cli

我正在尝试编写与操作系统以及Active Directory和Ocropus等内容的集成。

我知道一堆编程语言,包括标题中列出的语言。我正在努力学习 C ++ / CLI的工作原理,但无法通过我在线搜索找到简洁,准确和准确的描述。所以我在这里问。

你能告诉我C ++ / CLI的缺陷和特点吗?假设我知道所有C#并从那里开始。我不是C ++的专家,所以我的一些问题的答案可能“就像C ++”,但可以说我在C#。我想知道的事情:

  • 将C ++指针转换为CLI指针,
  • 从C#/ C ++传递值/双向间接指针/ CLI指针的任何差异以及“推荐”的内容。
  • gcnew,__ gc,__nogc如何使用
    • 多态性
    • 的Structs
    • 内部课程
    • 接口
  • “固定”关键字;那存在吗?
  • 使用C ++ / CLI编译加载到内核中的DLL可能吗?加载为设备驱动程序?内核调用?无论如何这意味着什么(即准确地将内容加载到内核中;我怎么知道它是否是?)?
  • L“my string”与“my string”? wchar_t的?有几种类型的字符?
  • 我们是否可以安全地将字符视为uint32s,或者应该如何对待它们以保证代码中的语言无差异?
  • 终结者(~ClassName(){})在C#中是不鼓励的,因为他们没有确定性地运行garantuees,但是因为在C ++中我必须使用“delete”或者使用copy-c'tors来堆栈分配内存, C#/ C ++交互之间有什么建议?
  • 在C ++ / CLI中使用反射时有哪些缺陷?
  • C ++ / CLI与IDisposable模式以及SafeHandle,SafeHandleZeroOrMinusOneIsInvalid一起使用效果如何?
  • 我在做DMA操作时已经简要介绍了异步异常,这些是什么?
  • 将C ++与CLI集成使用而不仅仅是使用纯C ++时,是否存在限制?
  • C ++中的属性与C#中的属性类似?
  • 我现在可以通过模板使用C ++中提供的完整元编程模式,还能像普通的C ++一样进行编译吗?
  • 您是否尝试使用boost编写C ++ / CLI?
  • 将boost库与C ++ / CLI连接的最佳方法是什么?你能给我一个将lambda表达式传递给迭代器/ foldr函数的例子吗?
  • 异常处理的首选方式是什么? C ++ / CLI现在可以捕获托管异常吗?
  • 动态IL生成与C ++ / CLI的协作效果如何?
  • 它是否在Mono上运行?
  • 我应该知道的任何其他事情?

注意:我真的在问C ++ / CLI的特点,它的陷阱。

2 个答案:

答案 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框架。我不认为助推在这里有多大帮助。