将C ++移植到C#

时间:2010-10-17 14:48:17

标签: c# c++ refactoring

在我看来,C ++和C#是非常类似的编程语言。如果需要将C ++代码移植到C#是唯一支持的平台的平台上,需要完成多少工作?

我应该准备好了,大多数C ++代码都需要重写为C#吗?或者,由于语言的相似性,重构是否应该非常容易和直接?

我知道,它将取决于应用程序本身,但我一般都在询问。

5 个答案:

答案 0 :(得分:22)

我最近为C#做了一个C ++应用程序的主要端口。总的来说,我认为这是一次愉快的经历。这些是我采取的步骤,它们可能适用于您的应用程序,也可能不适用。

  1. 在C#中获取“脚手架”,设计您的架构。如果您选择这样做,现在是时候从现有应用程序进行主要体系结构更改。
  2. 让您的测试到位。我不能过分强调这个。由于您要移植现有应用程序,因此您应该已经有一组测试来验证应用程序的正确行为。您可以而且应该为C#应用程序重用这些测试。 移植时,这是一个让你有优势的东西 - 你知道(并且已经编写)了你想要的许多测试。开始移植您的测试项目。
  3. 为您的C#方法添加反映现有C ++方法的方法存根。鉴于C#中的框架支持,可能根本不再需要某些方法,或者非常简化 - 现在是时候决定。
  4. 复制并粘贴。是的我对大多数C ++代码使用了复制和粘贴 - 如果你小心的话,所有的流程语句基本上都可以重用。一旦粘贴一行一行,必须重写诸如使用指针等许多东西以使用等效的C#类型。
  5. 一旦你以这种方式重新编写了一个方法,给定你可能在C ++中缺少的框架支持/辅助类,然后在C#中随时可用,就可以进行明显的重新分解。此外,变量等的命名约定可以在这里更改,如果在VS 2010中内置支持,应该是直截了当的。
  6. 运行测试!尽早测试并且通常到目前为止你所拥有的整体框架产生与你可以用作参考的C ++应用程序完全相同的输出。这也是添加缺失测试的时候。
  7. 重构,重构,重构。每个应用程序都会老化,最有可能是您的C ++应用程序。仔细查看底层设计,尽可能简化和删除。通过运行测试来验证每个步骤。

答案 1 :(得分:7)

首先,这是移植而不是重构。我认为这是一个非常糟糕的主意。

确实,您可以(使用很多工作)将C ++端口转换为不安全的C#,但是说语法非常相似有点过时了。实际上,按照相同的推理方式,您可以将C ++移植到任何其他C派生语言中,这同样会很痛苦。

同样,如果你这样做,那么就会有大量的返工。使用现有的代码作为模型,这很可能不仅仅需要你从头开始重新编码,这在我看来是一个更好,更少杂乱的选择。

答案 2 :(得分:3)

使用/ clr编译器选项编译C ++代码。这会将代码转换为IL,它可以在大多数支持.NET的平台上执行。很少有C ++构造无法翻译,它必须使用非标准的编译器扩展,如__fastcall。

但是,我怀疑您会发现该平台需要可验证的代码。这是平台将代码限制为.NET兼容语言的常见原因。由于你没有提到执行环境,我无法猜测。由于指针操作,转换为IL的本机C ++无法验证。如果是这种情况,那么你正在寻找一个非常激烈的重写。

答案 3 :(得分:0)

我有兴趣知道C#在哪里是“唯一支持的平台”。

用新语言重写的问题可能是你是否需要重写代码的每一部分而根本不能使用任何旧代码。有时最好,即使在进行重写时,也要使其更像是一个重构:重写代码的某些部分,移动其他代码。已知现有代码可以工作,并且可能很难再现。这需要时间。需要有充分的理由进行完全重写。

.NET支持C ++版本,Visual Studio也附带Visual C ++来构建标准C ++,因此请考虑是否可以将其分阶段转换,以及是否真的必须重写整个事物。

答案 4 :(得分:-1)

将C ++代码移植到C#并不会那么难,假设所有依赖库都有现有的C#对应物。缺乏依赖性是最可能的陷阱。程序的核心概念,例如继承,堆,引用,数据结构,应该是相当容易翻译的。

这假设您没有调用任何特定的低级行为,例如自定义内存管理,因为C#并不真正支持那种事情,并且您可能会遇到严重问题。