首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简介C++/CLI用于C#/Haskell/F#/JS/C++/.程序员

简介C++/CLI用于C#/Haskell/F#/JS/C++/.程序员
EN

Stack Overflow用户
提问于 2010-03-08 01:29:47
回答 2查看 895关注 0票数 7

我正在尝试编写与操作系统的集成,以及active directory和Ocropus之类的东西。

我知道许多编程语言,包括标题中列出的语言。我正在努力学习C++/CLI是如何工作的,但是从我所做的搜索中找不到简洁、准确和准确的在线描述。所以我在这里问。

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

从C#/C++将'recommended'.

  • How指针转换为CLI指针的
  • 在传递值/双间接指针/CLI指针方面的任何差异,以及gcnew、__gc、__nogc与
    • Polymorphism
    • Structs
    • Inner classes
    • Interfaces

的工作方式

exist?

  • Compiling
  • 这个“固定的”关键字;这个带有C++/CLI加载到内核中的DLL可能吗?作为设备驱动程序加载?内核调用的?这意味着什么?
    • L“我的字符串”还是“我的字符串”?wchar_t?有多少类型的字符?我们是否安全地将字符作为code?
    • Finalizers (~ClassName() {})作为uint32s来对待,或者我们应该如何对待它们以保证在C#中语言冷漠(~ClassName(){})在C#中是不被鼓励的,因为它们没有决定性的运行,但是在C++中,我必须使用“删除”或使用copy-c‘’tors作为堆栈分配内存,C+ interactions?
    • What之间的建议是在C++/CLI中使用反射时的缺陷吗?
    • 使用IDisposable模式和SafeHandle时C++/CLI有多好?SafeHandleZeroOrMinusOneIsInvalid?
    • I've简要地阅读了进行DMA操作时的异步异常,这些是什么?
    • 在使用C++与CLI集成时是否对自己施加了限制,而不仅仅是在C++中执行与C#中的属性类似的普通
    • 现在可以通过模板使用C++中可用的完整元编程模式,并且仍然可以像普通的C++那样编译吗?
    • 是否尝试过用boost编写C++/CLI?
    • 是用C++/CLI连接boost库的最佳方式;您能给我一个例子,将lambda表达式传递给迭代器/foldr function?
    • What是处理异常的首选方法吗?C++/CLI现在能捕获托管异常吗?
    • ,它在Mono?
    • 上运行的动态IL生成有多好?

Note:我真的在问C++/CLI的特性,它的陷阱门。

EN

回答 2

Stack Overflow用户

发布于 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在这方面没有任何改变。

你真的有太多的分数在这里,一个问题。如果你真的想让我看每一点,我会的,但这将是一系列的博客文章,我只留下一个链接在这里。

票数 5
EN

Stack Overflow用户

发布于 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对这里有多大帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2398808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档