2010-07-28 67 views
2

我希望得到来自开发人员的非常具体的答案,他们希望知道如何解决您遇到的问题。将MFC(VC6)应用程序迁移到.NET 2008

我们有非常大的MFC(VC6)32位应用程序存在了10年。现在我们想将它迁移到.NET非托管64位应用程序。在这里,我们遇到了一些问题,我们的UI不应该改变,我们可能需要一些托管.NET类来简化开发,而不会影响架构如何使用非托管代码添加托管代码,很多win32 API可能会更改为新的API,应该运行XP,Vista,Windows 7操作系统的机器没有任何变化,这些活动不应该花费时间,新技术的分析应该做,因为我们是MFC程序员...

请分享你的经验,如果你有任何明确的文件将是非常有用的...

注: 为了清楚的理解,我重新措辞了一些观点。我们希望将我们的VC6本机代码32位应用程序迁移到具有64位支持的VS2008(或VS2010)本地代码(非托管C++)。主要要求是现有的用户界面不应该有任何变化。另外,如果.NET支持托管代码与非托管代码的组合,我们可以尝试在非托管C++环境中使用.NET远程等一些功能。我希望向所有人传达的一件更重要的事情是,我们不打算在C#中开始任何编码或从头开始编写代码。

+0

是否要改写在C#中您的应用程序对.NET还是你只想让你的MFC应用程序作为C++应用程序在Visual Studio 2008中编译? – auujay 2010-07-28 14:39:10

+0

你在非常具体的问题上要求*非常具体的答案*。不知道你在10年内避免这种情况后会遇到什么。 – 2010-07-28 14:46:45

+0

@auujay:我认为Snabak指的是在MFC2008中编译MFC应用程序并进行相关的64位支持更改。在C#中重写应用程序是没有问题的,因为整个KLOC将达到约550 KLOC。 – ckv 2010-07-28 15:02:33

回答

1

正如杰里所说的,乔尔在他的博客中谈到了这件事你应该永远不要做。 此外,还有其他一些事情要考虑与此转换。

  1. 你会用现有的VC++ 6.0代码库做什么?
  2. 进行更改后测试整个产品所需的资格时间(不同的操作系统,SQL等)。
  3. 如何管理带有和不带64位支持的2个代码库。

PS:最重要的,你修复并有资格在VS2010你的产品的时候我想VS 2012就已经发布了:)

4

我们已经完成了这个步骤(VC6 - > VS2005 - > VS2008 - >(很快)VS2010),大多数问题都与API中的更改有关。

  • 不安全的字符串操作(STRCPY与strcpy_s),其发出警告信息(使用_CRT_SECURE_NO_WARNINGS预处理器定义删除他们,如果你不想解决这些问题全部)

  • 改在一吨原型消息处理程序(返回LRESULT,改变wParam和lParam,...)

  • 过时的API(你会发现他们出去很快就好了,我觉得有一个页面上MSDN有关)

  • 关于标准C++,编译器可能会更严格些。

很难去具体...

,但看看这个博客条目多一些信息:http://insidercoding.com/post/2008/08/20/Migrating-from-VC6-to-VC9.aspx

好运。 最大。

2

你所要求的并不是真正的迁移 - 至少在整个UI中,它几乎是完全重写的。除非你的“非常大的......应用程序”有一个非常小的,简单的UI,我会坐下来认真思考。阅读乔尔的Things You Should Never Do.

底线:这几乎肯定是一个真的的想法。如果你这样做,你需要开始意识到它会相当耗时。

如果你决定继续这样做,你几乎需要递增。要做到这一点,我可能会先找到现有代码中的各个功能块,然后将这些块转换为ActiveX控件。一旦你明白了你的主程序基本上是一个相当小的框架,它实例化并使用了ActiveX控件,那么在托管代码中创建一个新的框架就变得相当容易了,这些框架的功能大致相同,委派了大部分真正的工作到现有的ActiveX控件。完成之后,您可以开始将各个控件迁移到托管代码,只要您认为合适。

这样做的目的是为了避免长时间间隔,在此期间您只需编写重复旧代码的新代码,但无法为客户做任何更新。几乎我看到的唯一合理的替代方法就是有两个独立的开发团队:一个是继续开发并更新旧代码库,同时第二个团队从头开始全面重写。如果你有足够的钱,这种方法可以很好地解决。作为一个例子,微软已经多次完成了这样的事情。举几个例子来说,几年前有传言说Borland(当时是微软在编程语言工具方面最大的竞争对手)打算生产TurboBASIC时,微软决定当时的QuickBASIC(V2)真的无法与之竞争。他们的回应是建立了两个团队:一个做尽可能多的升级,以合理的方式向QuickBASIC 2生成QuickBASIC 3.第二个团队完全从头开始重写,生成了成为QuickBASIC 4的东西。

另一个例子是Windows 95/98/...与Windows NT。他们继续开发现有的Windows代码库,同时他们从头开始全面重写以生成Windows NT。尽管他们保持了两个团队的同步,所以UI看起来很相似,但两者几乎完全分开开发。只有经过年的两者之间的重叠,他们才终于退出了旧代码库的工作(有时我怀疑Windows Me的苦恼是否至少部分是故意的,或多或少地迫使用户迁移到NT代码库)。

但是,除非你能做到这一点,否则几乎你唯一的成功机会是使用增量方法。

+0

我们想要在某个时间执行两个项目(现有和新的迁移项目)。一旦迁移的项目(VS2008非托管C++ 64位项目)在生产领域具备资格,我们将停止支持现有版本的项目(VC6本地代码32位项目)。 – 2010-07-29 05:50:57

相关问题