我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI

Posted

技术标签:

【中文标题】我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI【英文标题】:Can I use C++/CLI (.NET Winforms/WPF ) to provide GUI for app written in native C & C++ 【发布时间】:2010-05-06 05:19:46 【问题描述】:

我有一个用 C 和 C++ 编写的应用程序。现在,我需要为这个应用程序提供一个 GUI。 MFC 对我来说是最好的选择。但我不熟悉MFC。

那么我可以使用 .NET 来为此构建 GUI 吗?如果是这样,如何?请说清楚。

如果我可以使用 .NET,我想我也可以使用 WPF,对吧?

【问题讨论】:

【参考方案1】:

您可以技术上在 C++/CLI 中编写 GUI,但我会强烈反对它。 C++/CLI 非常适合在原生 C++ 周围编写 .NET 包装器并将其暴露给其他 .NET 语言,但其他方面就没什么了。

在您的情况下,如果您真的打算使用 WinForms/WPF,那么我建议您使用 C++/CLI 围绕您的 C++ 代码创建一个包装器,然后在 C# 中构建实际的 GUI。

否则,像 Qt 或 wxWidgets 这样的 C++ 库也足以实现“原生”​​C++ GUI。

Here's a quick introduction to C++/CLI。这是 C++/CLI 入门的快速入门指南。构建 C++/CLI DLL 后,只需将其添加为对 C# 项目的引用,它就可以工作(tm)。

【讨论】:

1.如何做 MFC 和 C# 的事情? 2.Qt & MFC。我对这两个都不熟悉。哪一个容易上手并继续前进。 MFC 与 C# 或 Qt 无关。 Qt 是 MFC 的替代品。你不能在 C# 中使用 MFC,但 C# 有 WinForms,从生产力的角度来看,它比 MFC 好得多。 @codeka 我想你不明白我想问什么。我只是问 1. 如何在我的应用程序上创建 C++/CLI 的包装器然后从 C# .NET 2 访问它。我知道 Qt 和 MFC 是不同的。我想知道哪个更容易学习和构建 GUI,因为我没有太多时间。 哦,对了,抱歉...codeproject.com/KB/mcpp/quickcppcli.aspx 这是 C++/CLI 入门的快速入门指南。构建 C++/CLI DLL 后,只需将其添加为对 C# 项目的引用,它就可以工作(tm)。对于 Qt/wxWidgets/MFC 的事情,我的 个人 偏好是 wxWidgets 而不是 Qt,因为 Qt 对我的口味的预处理有点重。但这是个人意见。 IMO,两者都比 MFC 领先光年。 @claws:我知道。表达式“x 比 y 早几光年”假设您将其视为 x 和 y 之间的“竞赛”。您也可以说“Qt 和 wxWidgets 比 MFC 领先几英里”。【参考方案2】:

将 C++ 应用程序组织为“服务器”,导出可由 GUI“客户端”调用的函数。将此 C++ 代码构建为 DLL,导出所述函数。将您的 GUI 应用程序创建为 .NET EXE,并让它使用 Platform Invoke (P/Invoke) 在您的 DLL 中调用上述函数。

【讨论】:

听起来不错。有任何指针可以为我提供有关此方面的详细信息吗?如何导出函数和 DLL 以及如何使用 P/Invoke Visual C++ 文档中介绍了创建 DLL 并从中导出函数。在 .NET SDK 中有一整节介绍使用 P/Invoke 从 .NET 调用本机 DLL。【参考方案3】:

这本书也值得特别提及,因为它涵盖了高级主题以及将 WPF 与 C++/CLI 结合使用: C++/CLI in Action (Manning)

【讨论】:

【参考方案4】:

取决于你是否想学习另一种语言? 如果您选择 C++/CLI 或 C# 路线,您必须在开始使用 GUI 之前熟悉这些语言。 是的,MFC 不是最好的,但至少你仍然可以使用 C++。 这似乎是微软希望你使用的,因为他们的大多数视频教程都是基于 MFC 的: http://msdn.microsoft.com/en-us/visualc/bb693459.aspx

如果您选择 WinForms C++/CLI 路径,Visual Studio 实际上为此提供了一个模板。即使是 2010 也没有提供像 C# 这样的 WPF 项目模板,因此您应该会收到 Microsoft 希望您将 C# 用于 GUI 内容的消息。

无论如何,如果您要移植的只是一个微不足道的应用程序或程序,那么使用 WinForms 并不难。实际上,它只是比使用 C# 更难一些,因为您可以在 Visual Studio 中使用相同的 GUI 编辑器,但是您必须手动编写比使用 C# 更多的代码。

而且您必须了解 Microsoft 的 C++/CLI,因为模板会在其中自动生成代码,您需要了解它的作用,这样您就可以忽略其中的大部分内容。

Ivor Horton's Beginning Visual C++ 2010 和 Visual C++ 2008 How to Program (2nd Edition) ~ Paul J. Deitel, Harvey M. Deitel 是我看过的仅有的两本涵盖 WinForm/C++/CLI 编程的书籍,所以您可能想看看那本书,或者像大家推荐的那样只使用 C#。

【讨论】:

@daveangel 可以提供这两本书的链接。 实际上,如果您阅读我提供的链接的 CH1 的第一个 PDF 示例,Horton 可以很好地解释 C++/MFC/CLI 之间的差异,甚至还有一张很好的照片:) 太棒了!!为什么不编辑您的帖子以包含详细链接。另外请链接您正在谈论的第二本书

以上是关于我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Linux 上使用 .Net Core 3.1 创建 C++/CLI 代码的 C# DLL

避免在 C++/CLI 项目中加载 .Net Dlls?

部署 .NET C++/CLI DLL 的先决条件?

在 C++/CLI 中使用时未创建 C# 应用程序 log4net 日志文件

编译 C++/CLI DLL 时出现警告

Mono .NET 是不是支持和编译 C++/CLI?