CSharp - 在 wpf/C# 或者 qt/c+ + 之间选择

我和我的团队正在开发一个应用程序,涉及用C 写后端,并涉及OpenCV,MIL等库的使用。

现在,我们需要开发一个GUI与此程序接口,以便GUI显示图像,并且用户可以与图像进行交互并注释/标记图像,然后运行用C 编写的图像处理算法以显示结果。

  1. 我可以直接使用WPF与C (而不是Visual C#)接口?
  2. C 中的代码将变得很大,并且还会涉及一些库,所以我可以使用C调用C 函数,而不是让非托管非OO的C 代码与WPF一起工作,花在学习Qt上的时间会更少吗?

时间:

我已经将Qt与C++和WPF一起使用了,我更喜欢WPF作为用户界面框架,Qt不错,尤其是4.0之后。

WPF文档更好,而且在线社区更大,WPF已经存在了很长时间,功能更加成熟,功能更加丰富。

WPF将需要一个C/CLI层(托管C),以便与您的c代码库正确连接。我个人会远离PInvoke 。

Qt挺容易,因为它是基于c的,但是您需要在c类型和Qt类型(例如QString,QList等)之间进行一些转换。

要考虑的另一件事,是您想要UI的外观。例如,如果您想要漂亮的外观(Office 2008,2010),那么Qt将不会带来这种效果。

它基于c++和ActiveX ,

如果是C++,请坚持使用Qt ,Qt 的OpenGL小部件可以处理项目的3D部分。选择WPF技术路线将迫使您在C#或VB.net中做一些工作(总是不好的做法)。在C++中使用WPF并没有太多优势,另外,你的代码的其余部分是C/C++ ,这挺适合您的需求。 OpenCV,MIL等与Qt集成起来要容易一些,不用WPF进行P/Invoke调用(由于.Net,这也将导致延迟)。

如果你已经拥有大型C++代码库,我想你应该坚持使用Qt ,WPF并不像他们说的那么简单,也不容易开发。

你的WPF代码需要在 C# 或者VB中才能获得设计器和工具支持。 通过使用混合模式程序集,C# 和 C++ 之间的互操作非常好,它允许你在 C++ 中编写编译为托管和非托管代码混合的模块。 这给了你type-safe互操作本机 C++ 库。

在这里查看 关于混合模式程序集的信息。 我们可以为他们担保。

IMO的一个重要考虑因素是WPF学习曲线。 如果你能让你的团队和你一起,我相信它可以非常高效。

WPF是用户界面框架而不是编程语言。 你可以在 C# 或者 VB. NET 中编写WPF应用程序。 使用本机 C++ 代码从. NET 应用程序中,你有两个选择:

  1. PInvoke - 允许从原生库调用纯C API 。 无法使用 C++ 类,只能使用函数。 它的工作方式与中的API调用相同。

  2. 使用 C++/CLI 包装器,你可以编写. NET Dll,它可以被 C#/vb. NET 客户端使用。 在内部,这个Dll使用原生 C/C++ 库。

如果你对WPF感到舒适,并且不需要cross-platform解决方案,你可以使用它。 你需要学习互操作性部分。 C++/CLI 是相当复杂的语言,但懂得原生 C++ 和. NET的程序员可以学习它。

另一方面,Qt允许直接使用任何现有的C/C++ 代码,并提供cross-platform解决方案。

在WPF场景中,你不会直接从 WPF ( 例如 ) 接口。 对非托管 C++ 直接执行xaml视图。 你总是想把你的C++ 模块打包为一些VB或者 C# 托管包装。 (你理论上可以使用托管 C++ 包装,但是你是疯了。)wpf需要薄的视图模型至少. NET 语言写的。 WPF不应该直接访问你的非托管代码,因此问题更多".NET 应用程序能与非托管 C++ 交互",答案是 yes,当然。

http://msdn.microsoft.com/en-us/library/aa984739(v=VS.71).aspx

最近几年我一直在使用SWIG来在WPF应用程序中使用纯( 非托管) C++ 。 它工作得很好,根本没有问题,这是为大型的应用程序,如电子设备维护培训。

SWIG很棒,因为有了一套接口文件( 你写的基于你的. h 头文件,所以非常简单),你可以生成所有的scaffold代码,将你的C++ DLL导出为 C#,python,Lua,Java等多种语言。 痛饮生成所需要的代码,如果你想扩展从 C# C++ 类或lua,它处理通过跨语言( 因此,一个Lua脚本可能抛出一个异常,它通过 C++ 层,并在 C# 级别被捕获,例如) 例外, 等等 段我们从来没有触摸pinvoke( SWIG都这么做了) 。 令人惊叹.

通过这种方式,同一个SWIG界面允许我们使用 WPF ( C#,带有. NET 4 ),为一些现有的库提供一个原生的C++ 后端( 通过 SWIG ),并嵌入一个Lua解释器来支持应用程序( 通过 SWIG,同样的. i 接口文件,以及在sourceforge上的lua-icxx,简化与 Lua API解释器栈的接口)的脚本编写。

我想知道,在这个线程开始之后,qt/与 wpf/xaml的比较是怎样的。 现在我看到现在Qt3D可以添加内置的3,它已经在WPF中有一段时间了。

...