原生C ++和C#互操作

所以我正在构建一个必然会使C ++工作的应用程序,但是MFC / ATL对我来说太麻烦了,所以我有一个很好的想法,就是用本机C ++中的所有“思考”代码和C#中所有漂亮的UI代码。 但问题是两者之间的互操作性。 在我对此过于沉迷之前,我想知道这是否是一个已解决的问题,并且有一个非常好的方法来做到这一点。 请注意,我不想在同一模块中混合使用逻辑和显示,因为它会产生恼人的高耦合。

这是我到目前为止所拥有的:

在此处输入图像描述

那么告诉我,它可以做得更好吗?

你可能有充分的理由让你的核心成为DLL。 但这没有必要。 我已经成功使用了C ++应用程序,它创建了一个App Domain并将一个程序集加载到它中,然后在app域中实例化一个对象并调用它,并将一个接口传递给应用程序。 这基本上是C-runtime在你制作非托管应用程序时所做的事情。

C ++代码公开给C#代码的接口在C#中定义。 我认为这比在纯COM中定义接口更容易。 C#interop比C ++更能控制编组。

  • 创建一个定义接口的文件app_interface.cs
  • 将app_interface.cs编译成dll,我们不关心dll。 我们需要类型库。
  • 在C ++代码中#import raw_interfaces_only这会将typelib转换为带有接口定义的C ++ .h文件:app_interface.tlh
  • 实现接口

您可以使用控制编组的属性来撒上app_interface.cs

 [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")] // guid changed from what I really use public interface IMyHostApplication { ... void AddErrorDetails ( [MarshalAs(UnmanagedType.Error)] uint hr, [MarshalAs(UnmanagedType.LPWStr)] string szErrDetails); ... }