如何将大型MFC应用程序迁移到WPF/.NET平台?有哪些技术可用?

31
我目前正在处理一个非常庞大的遗留MFC MDI应用程序。它有大量的UI元素-可停靠工具栏、自定义树控件、上下文菜单等。它是一个图像处理应用程序,因此主视图使用DirectX和OpenGL进行渲染。该产品已经有10年的历史了,我们的其中一个重点是更新其外观和感觉。
知道微软在C++/MFC和.NET之间提供了很好的互操作性,我认为分阶段迁移代码库是有意义的。我现在遇到的问题是从哪里开始。
一种方法是用WPF取代MFC框架,并尽可能多地重用C++代码。这将让我们最大程度地利用WPF架构,但意味着开发周期会很长,直到我们完全恢复正常为止。
另一种方法是逐个用WPF替换MFC控件。这将使我们能够逐步工作。我的担忧是这种方法意味着托管代码和非托管代码之间将有很多连接点,而且我不确定从何处开始替换类似主菜单和工具栏之类的内容。
还有其他选项吗?
欢迎提出任何建议或关于此主题的信息链接。
更新:DavidK提出了一些很好的问题,因此我添加了这些动机。
1) 产品未来的开发
该产品仍在积极开发中,定期添加新功能。我认为慢慢迁移到C#/WPF是很有意义的。在我有限的C#/WPF经验中,我发现生产率提高比在C++/MFC中工作惊人。
我们使用WPF还能获得利用多屏系统的能力。MFC应用程序局限于一个顶级框架,使得利用多个监视器非常困难。
2) 员工保留和招募

越来越难找到愿意在MFC上工作的开发人员。对于当前开发人员的职业发展来说,接触新技术也非常重要。


2
如果可以的话,我会给超过一个赞的。 - Paul Sonier
2
理想的迁移方式是使用QT,这样至少您现有的开发人员不会渴望使用未来几年内推出的下一个酷炫GUI技术 :) - gbjbaanb
4
QT的问题在于它与MFC相比只是一个横向移动,而不是技术和生产力的飞跃。除非你正在寻找一个跨平台解决方案,否则我看不出从MFC转向QT的好处。对于一个Windows开发团队来说,这种转变没有任何意义。 - 17 of 26
5个回答

12

重新审视这个问题,因为我已经成功地用WPF替换了我们的顶级MFC UI(主框架、窗口和工具栏)。

事实证明,我们的核心绘图代码只需要一个HWND来渲染。这使得重用我们现有的C++代码库变得非常容易。

以下是我采用的关键方法的快速概述:

  • 使用.NET HwndHost类来托管HWND,以便C++绘图代码进行渲染
  • 为需要暴露给WPF/C# UI代码的任何本地C++代码创建C++/CLI包装器
  • 将大部分MFC对话框保留在本地C++代码中。这最小化了完成UI所需的工作量。MFC对话框可以逐步迁移到WPF。

顺便说一句,我们正在使用Divelements的SandDock和SandRibbon,并且到目前为止非常满意。


3
我认为你没有涵盖所有的简单方法,尽管这与底层逻辑与UI层的分离程度有很大关系。
不想表现得消极:你确定这么做值得吗?如果我从头开始编写一个大型应用程序,我不会选择使用C++和MFC,但是考虑到你现在所处的位置,重新编写代码能带来什么好处呢?它能增加用户愿意为之付费的新功能吗?是否会有无法运行新版本的用户被割掉?我怀疑你将从改善当前应用程序的外观中获得更大的投资回报。例如,它是否具有XP风格清单,以使常见控件具有XP外观?花费几天时间更新一些部分(例如使用新的样式文件对话框)将使您最接近闪亮的新外观。请记住,即使是最新、最闪亮的Office 2007也是由Microsoft使用普通的Win32控件实现的。

非常好的观点,我会在我的问题中更新这次调查的动机。 - 17 of 26

2

我曾经在一个WinForms项目中做了同样的事情。我们需要将我们的MFC项目迁移到.NET 1.1,于是我们决定将所有核心功能都用受控包装器进行编写。然后我们编写了一个WinForms前端,并逐步地插入遗留的C++代码。我认为从长远来看我们做出了正确的选择。如果我们同时试图保留MFC前端,我无法想象我们会怎么做。


2

FWIW,在此期间,您可以使用MFC功能包(可在VS2008 SP1中获得)快速为您的应用程序提供Office 2007外观和感觉(如果您的用户需要,甚至可以添加一个功能区,尽管这将更加复杂)。我使用这些新类重新设计了一个旧的MFC应用程序的UI,并且现在,公平地说,它看起来很棒,我的用户非常满意(您可以支持各种外观和颜色方案)。微软选择了BCG工具包,但如果您愿意支付一小笔金额,则还有其他可用的工具包(例如CodeJock)。

我知道这并没有回答您的问题,但如果您只是想进行UI更改,那么这可能值得一看。


这种方法可能很有用,因为它会立即产生效果,并且应该给你时间来正确地重写WPF应用程序。 - ChrisF
你有任何解释如何完成这个的链接吗?我会自己搜索一些谷歌,但如果你手头有一个链接会更容易:)。 - 17 of 26
这里有一些优秀的示例可供使用: http://msdn.microsoft.com/en-us/library/bb983962.aspx 包括MS Outlook 2007 UI,VS2008 UI等。 - Rob

1

我认为你已经掌握了这些策略。请注意,在迁移到WPF时,一个潜在的痛点是并非每个控件都有句柄。这是不幸的互操作性方案之一。据我所知,与MFC和WPF进行互操作的唯一方法是通过WindowsFormsHost。WPF范例也与MFC / WinForms截然不同,因此可能存在一些翻译问题。

考虑到你拥有庞大但功能上运作良好的遗留代码库,我可能会支持你的第二种方法。逐个控件开始,将其转换为WPF风格。创建新托管控件与基础代码库之间的定义明确的接口,然后针对该接口进行工作。如果逐个进行,您将在较低风险级别下使用WPF的学习曲线(在我的看来相当陡峭)。

我觉得值得注意的是,如果你要使用WinForms,我可能会建议你采用前者的方法。更接近的范例和相对平稳的学习曲线会更容易一次性解决所有问题。


我发现的一件事是如何在MFC中托管WPF内容:https://dev59.com/OXRA5IYBdhLWcg3wyBD1 - 17 of 26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接