需要建议将其中一个遗留C ++组件转换为C#

时间:2010-07-04 20:13:21

标签: c# c++ mfc

目前,我们正在开发一个C ++遗留代码库,它由几个软件组件组成。

其中一个组件是以极难维护的方式编写的。 (例如,内存分配在X位置完成,但内存取消分配在Y位置完成。这使内存管理成为一项痛苦的工作)。到目前为止,我们能够解决(或解决)所有内存泄漏问题。

然而,经过几轮错误修复后,我们的感觉是,由于该软件组件的高维护成本,我们无法远离目前的里程碑。

我知道重写源代码可能不好:http://www.joelonsoftware.com/articles/fog0000000069.html

然而,我们预计不会重新考虑当前代码,而是因为

而从头开始重新编写代码会更好
  • 到目前为止,团队中没有人能够完全理解该软件组件代码。
  • 传统软件组件是一小块软件。 20k行,我想
  • 我们的团队非常明确要求以及我们正在努力实现的目标

因此,我们计划采用托管代码,至少使内存管理成为一项无痛的工作。我们计划选择C#,作为

  • 我们所有的C ++代码都是使用Microsoft VC ++编译的
  • 我们在其他软件组件中使用MFC。 (在DLL形式中)每个DLL都有自己的资源。

我来自C ++和Java背景,对C#一无所知。

  1. C#与MFC DLL接口有多好,有些DLL函数会调用MFC GUI吗?
  2. 我需要注意什么?
  3. 如果我们使用托管C ++,那么与传统C ++ DLL的接口是否会更容易?
  4. 感谢。

2 个答案:

答案 0 :(得分:1)

我处于类似的情况,我也做了一些混合C ++和C#的实验。然而,我的申请中的问题是:

  • 应用程序没有明确地分成不同的模块,因此很难将特定模块从C ++移动到C#
  • 应用程序是cpu密集型的,实验显示从C ++到C#或C#到C ++的调用有很大的开销

此外,您无法直接从本机/非托管C ++调用C#,这意味着我必须引入一个额外的中间C ++ / CLI(或称为C ++ .Net?)层。

因此,我选择不转向C#,而是继续使用C ++。

因此,如果您想从C ++迁移到C#,请确保:

  • 你有明确分开的模块
  • 从C ++到C#(反之亦然)的转换(调用)位于经常不使用的位置(因此不会在cpu密集型任务期间)

此外,请记住,如果您不是该项目的唯一开发人员,那么所有(或大多数)开发人员也应该学习C#。您不希望将所有C#代码委托给最新的初级开发人员,因为如果他离开,您将(或可能)遇到麻烦。

答案 1 :(得分:0)

  

C#与MFC DLL的接口有多好,有些DLL函数会调用MFC GUI吗?

一点也不好。你不能P / Invoke到C ++库 - 它只适用于C导出。您需要编写一个包装器,将C库接口公开给您从C#进行P / Invoke,或者您需要使用C ++ / CLI重新编译MFC。没有什么理由这样做,因为Winforms是一个类似于MFC for .NET代码的库。

  

我需要注意什么?

我不明白这个问题。

  

如果我们使用托管C ++,那么与传统C ++ DLL的接口是否会更容易?

考虑到你不能使用C#,是的。您必须重新编译这些C ++ DLL以使它们公开C接口,或者您必须使用C ++ / CLI从源代码重新编译它们。


注意:无论你在这里做什么,你仍然要担心内存管理和本机代码中发生的任何事情的对象生命周期。 CLI不会自动为您管理本机资源。