在C#WPF应用程序中使用C++11库的选项是什么

What are my options for using a C++11 library in a C# WPF application?

本文关键字:选项 是什么 C++11 C#WPF 应用程序      更新时间:2023-10-16

我正在用C++11编写一个跨平台(OS X和Windows)的桌面应用程序。我打算在两个平台上使用相同的C++11内核,使用本机框架进行UI(OS X上的Cocoa和Objective-C,Windows上的WPF和C#),因为我相信最好的用户体验是本机体验。

目前,该应用程序在两个平台上都作为控制台应用程序运行。该应用程序执行一些CPU密集型工作,并为进度报告提供回调,完成后,实例化表示处理结果的项集合(std::vector<std::unique_ptr<Item>>)。

我的目标是让C++11库以与MVC和MVVM模式兼容的方式充当UI的模型。

UI必须:

  • 允许用户选择要处理的文件(打开文件对话框并将文件路径发送到C++库)
  • 显示进度(处理来自C++库的回调以更新进度条)
  • 在WPF表单中显示结果(访问Item类并显示它提供的信息)

我看过WinRT,似乎没有太多信息可用于桌面应用程序。我也不喜欢用C++创建UI本身的想法。我的目标是让数据进出C++应用程序,并使用C#来处理UI,因为我相信这是一种更有效的WPF工作方式。

我知道p/Invoke,但我的理解是它只适用于C接口。围绕C++11创建这样一个接口似乎很麻烦。

我也知道C++/CLI,但我不确定它是否能满足我的需求,或者是否与C++11兼容。

我看了CppSharp,但这似乎是一项正在进行的工作,我怀疑我是否知道如何解决可能出现的任何问题。

我在C++方面有很多经验,在C#方面也有一些经验,但我不确定我是否错过了更好的选择,或者以上哪种方法是合理的。

我强烈建议使用C++互操作(http://msdn.microsoft.com/en-us/library/2x8kf7zx.aspx)。我已经用过好几次了,它相当简单。在所有情况下,我都在WinForms应用程序中使用了它,而不是WPF,但我认为这不会是一个问题。您需要在内部CPP实现上创建一个托管包装器。为此,您需要使用C++/CLI。您还需要在.NET和C++本机类型之间封送参数。有一堆助手函数和智能指针可以帮助实现这一点。您的其余代码可以是本机代码,并将照常编译。