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

Hen*_*rik 7 c# c++-cli

我正在尝试编写与操作系统以及活动目录和Ocropus之类的东西的集成.

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

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

  • 将C++指针转换为CLI指针,
  • 从C#/ C++传递值/双向间接指针/ CLI指针的任何差异以及"推荐"的内容.
  • gcnew,__ gc,__nogc如何使用
    • 多态性
    • 结构
    • 内课
    • 接口
  • "固定"关键字; 那存在吗?
  • 可以使用C++/CLI编译加载到内核中的DLL吗?加载为设备驱动程序?内核调用?无论如何这意味着什么(即将内容加载到内核中;我怎么知道它是什么?)?
  • L"我的字符串"与"我的字符串"?wchar_t的?有几种类型的字符?
  • 我们是否可以安全地将字符视为uint32s,或者应该如何对待它们以保证代码中的语言无差异?
  • 在C#中不鼓励终结器(~ClassName(){}),因为它们没有确定性运行的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的特性,它的陷阱.

Ben*_*igt 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在此区域中不做任何更改.

对于一个问题,你真的有太多的要点.如果你真的希望我完成我将要做的每一点,但它将是一系列博客条目,我将在这里留下一个链接.


Nav*_*K N 5

将C++指针转换为CLI指针

CLI类型不必是指针.在C++/CLI中使用句柄(^).

从C#/ C++传递值/双向间接指针/ CLI指针的任何差异以及"推荐"的内容.

如果您需要与C#更好的互操作性,请避免使用指针.在C++/CLI中使用所有与指针相关的东西,并仅公开托管类型,以便C#应用程序可以轻松使用它.

"固定"关键字; 那存在吗?

pin_ptr<> 是等价的.

在C#中不鼓励终结器(~ClassName(){}),因为它们没有确定性运行的garantuees,但是因为在C++中我必须使用"delete"或者使用copy-c'tors来堆栈分配内存,是什么C#/ C++交互之间的建议?

C++/CLI支持确定性资源管理.编写析构函数时,编译器将IDisposable在类上实现接口并将析构函数转换为Dispose()方法.delete会调用它Dispose()来进行资源解除分配.因此,您在使用C#时没有遇到任何问题.您可以将用法包装using在C#语句中,以确保调用Dispose.

C++中的属性与C#中的属性类似?

是的他们是相似的.

我现在可以通过模板使用C++中提供的完整元编程模式,还能像普通的C++一样进行编译吗?

是.C++/CLI支持ref类的模板.您可以像使用标准C++一样使用元编程技术.但是这些不能移植到C#.

您是否尝试使用boost编写C++/CLI?

C++/CLI可以访问整个.NET框架.我不认为助推在这里有多大帮助.