是否可以将C ++与.NET框架一起使用?


18

我已经阅读了许多有关C#和C ++中GUI编程的评论。我注意到Microsoft的.NET框架对于GUI编程非常强大。那么可以使用C ++和.NET框架吗?

我认为这将是一个很好的组合,因为C ++是功能强大的语言,并且如我所读,.NET框架是Windows上GUI编程的首选。是否可以用C#编写GUI和使用C ++编写功能?


7
C#也是一种非常强大的语言。
亚当·克罗斯兰

2
@Ramhound:C ++ / CLI和C#一样强大根本不是真的。C ++ / CLI代码包含来自C ++编译器的所有优化,并且可以更快地执行,并且仍包含许多不在C#中的元编程和预处理器技术。
DeadMG

2
另外,如果一个人精通C ++,选择C#也不是什么挑战。我不是在说,而是在说。
钻机

4
既然您知道C ++,就可以在学习C ++ / CLI或C#之间进行选择。实际的C ++都不是。我建议学习C#,而不是尝试使用C ++ / CLI。C ++ / CLI并非本地语言,因此您会发现很多书籍和对C#的支持。
David Thornley,2012年

6
@ddacot没有,C ++并不意味着游戏开发的。就像所有其他编程语言一样,它用于软件开发。游戏恰好是一种软件。
MattDavey 2012年

Answers:


21

是的,它以前称为Managed C ++,现在称为C ++ / CLI。您可以像使用其他三种捆绑的托管语言C#,F#和VB.NET一样访问整个.NET Framework(GUI:WinForms,GDI +等)。


+1对Jesse的回答。如果我没记错的话,C ++ / CLI不支持多重继承。因此,请准备一些意外的功能。其中某些功能来自CLI的限制。我建议您在开始使用C ++ / CLI和“经典” C ++之前先尝试找出它们之间的区别。
伊戈尔·索洛伊登科

第一个链接中对此进行了详细介绍。因此,摘要是:“ C ++随时间发展,并且大多数用该语言编写的软件都是面向对象的。托管C ++以及类和基于类的对象的使用仍然像Visual C ++一样普遍。托管C ++中对此的唯一主要更改“这是因为不支持多重继承的功能。这是由于CLR的限制。在CLR的垃圾回收器管理的类不能继承多个类。”
Jesse C. Slicer 2012年

没关系。实际上,我不太擅长C ++。我只是认为可能存在另一个可能引起问题的重要差异。
Igor Soloydenko

上一次我写C ++的时间是上个世纪的某个时候:)
Jesse C. Slicer 2012年

1
@ keykeeper,C ++ / CLI的典型用法是成为非托管C ++库和托管世界之间的桥梁。这样的使用就足够了。当然,在其中编写较大的代码没有任何意义。
SK-logic

6

不要忘记最灵活,最简单的选项,这是Unix世界的典型选择,但由于某些原因,在Windows中并不常见:将GUI和逻辑拆分为不同的进程,通过任何合理形式的RPC进行通信(例如,即使管道也应工作)。优选地,具有简单的人类可读文本协议。

这样,您就可以使用自己喜欢的任何技术来实现GUI(或各种GUI),并从更适合需要的内容(C ++,脚本等)中构建逻辑组件。

我不知道Windows世界中单片设计方法的任何合理优势。


4

几年前,在Managed C ++时代,我就这样做过。我们在一个非托管DLL中具有一些业务逻辑,我们希望将其合并到用C#编写的向导式GUI中。为此,我创建了一个托管C ++程序集,使其位于托管GUI应用程序和非托管DLL之间,并在该程序集中使用System :: Runtime :: InteropServices :: Marshal将托管类型(System :: Int32)的值转换为非托管类型类型(int),反之亦然。

尽管似乎不赞成使用托管C ++,但相同的主体可能适用于C ++ / CLI。


3

并不是的。有一种混合语言C ++ / CLI,但这仅对互操作有用(Microsoft的官方政策)。由于.NET框架的设计方式,有许多语言语义确实不适合在CLR上运行,而C ++展示了许多语言语义。


7
我不同意这个说法。C ++ / CLI非常适合许多实现。
拉姆猎犬,2012年

3
@Ramhound:Microsoft本身仅推荐将其用于互操作。那是他们的官方政策。
DeadMG

2
@DeadMG您可以为此提供源吗?
sq33G 2012年

1
@DeadMG,你错了。使用本机逻辑运行.NET GUI的方法有很多。
SK-logic

2
@DeadMG-除非您提供证明这是微软的官方政策(我不相信这一分钟),否则您只是绕过FUD
Ramhound

3

到目前为止,C ++ / CLI角度已经被很多答案所涵盖,但是另一种实现方法是使用PInvoke。这允许C#程序调用用C ++编写的dll中包含的函数。PInvoke的优点是您的dll完全不可知会从.Net调用的事实。这意味着您可以调用没有源代码的dll,即使您使用了源代码,也不必使用/ clr选项重新编译它。这意味着您可以将此dll与其他C ++程序以及C#程序一起使用。有一些很棒的C / C ++库:PInvoke使您可以利用这些库。有时Win32库提供的功能在.Net中是不可用的:PInvoke允许您使用它们。

使用PInvoke的最棘手的部分之一就是知道如何将非托管签名转换为托管签名。但是有一个备忘单可以帮助您。


但是,当直接使用P / Invoking C ++时,请注意整顿,或者最好在两者之间提供一个薄的C包装器。
SK-logic

0

您也可以通过COM(组件对象模型)使用C#莳萝。对我来说,COM比使用Managed C ++更好,因为Visual Studio 2010没有对Managed C ++的智能感知。以我为例,我们已经有一个大型的C ++应用程序,但希望尝试从MFC迁移到WinForms或WPF。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.