我正在尝试编写与操作系统的集成,以及active directory和Ocropus之类的东西。
我知道许多编程语言,包括标题中列出的语言。我正在努力学习C++/CLI是如何工作的,但是从我所做的搜索中找不到简洁、准确和准确的在线描述。所以我在这里问。
你能告诉我C++/CLI的缺点和特点吗?假设我知道所有的C#,并从那里开始。我不是C++的专家,所以我的一些问题的答案可能是“就像C++",但可以说我在C#。我想知道的是:
从C#/C++将'recommended'.
的工作方式
exist?
Note:我真的在问C++/CLI的特性,它的陷阱门。
发布于 2010-03-08 02:24:47
首先,您混淆了现在已经失效的“托管扩展for C++”(其中包含__gc和__nogc关键字)和新的和当前支持的C++/CLI语言,后者最终提供了指针(本机)和句柄(托管对象,它们实际上是作为指向.NET对象所在的垃圾收集内存的指针实现的,但您不应该将它们看作指针,因为它们会由垃圾收集器自动调整)。这两种类型的指针是完全不同的,只有内置类型与两者兼容,然后您只需将它们装箱以获得句柄。您永远不能有指向托管堆外部的句柄,并且只能在pin_ptr生存期内(仅限于本地范围)将本机指针输入托管堆。托管类可以保存指向本机内存的指针,就像C#可以有IntPtr成员一样。本机类型可以使用gcroot模板类型持有托管对象的句柄,该类型包装了System::GCHandle。
Microsoft ++/CLI编译器能够根据您使用的/clr、/clr:pure或/clr:safe (最后一种限制/clr:pure只生成可验证的/clr:pure)生成纯MSIL或MSIL和本机代码的混合物。大多数其他问题的答案取决于这些模式中的哪一种。例如,它生成的任何MSIL都将在Mono上运行,但是混合的本机和MSIL不会运行,因为它依赖于Microsoft .NET运行时的内部。
任何限制只适用于用C++/CLI创建的托管类型(例如ref类、enum类)。本机类型,即使编译为纯MSIL,也具有C++语言的充分灵活性,包括多重继承、模板等。
C++/CLI捕获本机代码和托管代码中的托管异常类型(/clr强制使用/EHa编译器选项)。
C++/CLI提供堆栈语义语法(声明一个类型不包括^后缀含义句柄的变量)。这对于局部变量和托管类型的成员都是可能的。编译器将自动生成对IDisposable的调用::Dispose用于在所有常见位置实现它的类型(比如C#使用块作为局部变量,在托管类型中自动创建IDisposable实现,调用所有成员)。
Lambda还没有可用,因为在下一个版本的Visual (2010)中,它们将使用即将发布的C++标准定义的语法添加。
您不能在内核模式下运行托管代码,不管您使用的是什么编译器,C++/CLI在这方面没有任何改变。
你真的有太多的分数在这里,一个问题。如果你真的想让我看每一点,我会的,但这将是一系列的博客文章,我只留下一个链接在这里。
发布于 2010-03-08 04:14:10
将C++指针转换为CLI指针
CLI类型不必是指针。在C++/CLI句柄(^)中使用。
在传递来自C#/C++的值/双间接指针/CLI指针以及什么是“推荐的”方面的任何差异。
如果您需要更好的与C#的互操作性,请避免使用指针。使用C++/CLI中所有与指针相关的内容,并且只公开托管类型,这样C#应用程序就可以很容易地使用它。
“固定”关键字;存在吗?
pin_ptr<>是等价的。
终结器(~ClassName() {})在C#中是不被鼓励的,因为它们不一定要运行,但是由于在C++中,我必须使用“删除”或使用copy‘’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框架。我不认为boost对这里有多大帮助。
https://stackoverflow.com/questions/2398808
复制相似问题