我已经阅读了许多有关C#和C ++中GUI编程的评论。我注意到Microsoft的.NET框架对于GUI编程非常强大。那么可以使用C ++和.NET框架吗?
我认为这将是一个很好的组合,因为C ++是功能强大的语言,并且如我所读,.NET框架是Windows上GUI编程的首选。是否可以用C#编写GUI和使用C ++编写功能?
我已经阅读了许多有关C#和C ++中GUI编程的评论。我注意到Microsoft的.NET框架对于GUI编程非常强大。那么可以使用C ++和.NET框架吗?
我认为这将是一个很好的组合,因为C ++是功能强大的语言,并且如我所读,.NET框架是Windows上GUI编程的首选。是否可以用C#编写GUI和使用C ++编写功能?
Answers:
是的,它以前称为Managed C ++,现在称为C ++ / CLI。您可以像使用其他三种捆绑的托管语言C#,F#和VB.NET一样访问整个.NET Framework(GUI:WinForms,GDI +等)。
几年前,在Managed C ++时代,我就这样做过。我们在一个非托管DLL中具有一些业务逻辑,我们希望将其合并到用C#编写的向导式GUI中。为此,我创建了一个托管C ++程序集,使其位于托管GUI应用程序和非托管DLL之间,并在该程序集中使用System :: Runtime :: InteropServices :: Marshal将托管类型(System :: Int32)的值转换为非托管类型类型(int),反之亦然。
尽管似乎不赞成使用托管C ++,但相同的主体可能适用于C ++ / CLI。
并不是的。有一种混合语言C ++ / CLI,但这仅对互操作有用(Microsoft的官方政策)。由于.NET框架的设计方式,有许多语言语义确实不适合在CLR上运行,而C ++展示了许多语言语义。
到目前为止,C ++ / CLI角度已经被很多答案所涵盖,但是另一种实现方法是使用PInvoke。这允许C#程序调用用C ++编写的dll中包含的函数。PInvoke的优点是您的dll完全不可知会从.Net调用的事实。这意味着您可以调用没有源代码的dll,即使您使用了源代码,也不必使用/ clr选项重新编译它。这意味着您可以将此dll与其他C ++程序以及C#程序一起使用。有一些很棒的C / C ++库:PInvoke使您可以利用这些库。有时Win32库提供的功能在.Net中是不可用的:PInvoke允许您使用它们。
使用PInvoke的最棘手的部分之一就是知道如何将非托管签名转换为托管签名。但是有一个备忘单可以帮助您。