将C++移植到C#

6

C++和C#是相似的编程语言,我认为。如果需要将C++代码移植到只支持C#的平台上,需要做多少工作呢?

我应该准备好大部分C++代码需要重写成C#吗?还是因为语言相似,重构会相当容易和直接?

我知道这取决于应用本身,但我是在一般情况下询问。


9
C++和C#看起来非常相似,但它们是完全不同的编程语言 - 我曾试图学习C++,认为自己掌握了C#就有所帮助,但实际上并没有。除非可以使用C++/CLI,否则您需要彻底重写代码。我作为评论发布这个信息是因为我的C++技能还不够好,无法给出详细答复。 - Michael Stum
2
我还没有看到过支持C#而不支持C++的平台... - Thomas Levesque
5
@Thomas - Windows Phone、XBox、一个网络浏览器。 - Hans Passant
@Hans Passant,说得好... 但实际上并不是C++不受支持,而是API不向开发人员开放。据我所知,这些平台的核心不是托管代码。但无论如何,这对开发人员来说没有实际区别,所以你是正确的... - Thomas Levesque
为了揭开仅由C#支持的平台的秘密,它就是微软XNA。(http://en.wikipedia.org/wiki/Microsoft_XNA#XNA_Framework) 如果我想将任何应用程序移植到Windows Phone 7上,我所知道的唯一方法就是使用C#来编写该应用程序。 - Bunkai.Satori
显示剩余5条评论
5个回答

28

最近,我把一个C++应用程序重构成了C#。总体而言,这是一次愉快的经历。以下是我采取的步骤,它们可能适用于您的应用程序,也可能不适用。

  1. 在C#中搭建架构并设计你的架构。如果你选择这样做,现在是引入现有应用程序重大架构更改的时候。
  2. 准备你的测试。我无法过分强调这一点。由于你正在将一个现有的应用程序移植到另外一种编程语言,你应该已经有一组测试来验证你的应用程序的正确行为。你可以并且应该重复使用这些测试用例用于你的C#应用程序。这是移植时给你的优势 - 你知道(和已经编写了)你想要的许多测试用例。开始移植你的测试项目。
  3. 为你的C#方法添加反映现有C++方法的方法存根。鉴于C#的框架支持,某些方法可能不再需要,或者非常简化 - 现在是决定的时候。
  4. 复制和粘贴。对于大部分C++代码,我确实使用了复制和粘贴 - 只要你小心,所有的流程语句基本上可以被重用。一旦粘贴完成,请逐行检查,许多事情,如指针的使用等都必须重写以使用等效的C#类型。
  5. 一旦以这种方式重新编写了一个方法,请根据框架支持/辅助类进行明显的重构。在C++中缺少这些东西,但在C#中却可以轻松获得。此外,在此处可以更改变量的命名约定,鉴于VS 2010中内置的支持,应该很简单。
  6. 运行你的测试!尽早而经常地测试你所做的整个框架是否产生与你的C++应用程序完全相同的输出,以便你可以将其作为参考。现在也是添加丢失的测试用例的时间。
  7. 重构、重构、重构。每个应用程序都会老化,你的C++应用程序很可能也不例外。仔细看看底层设计,并尽可能地简化和删除。通过运行测试用例来验证每个步骤。

嗨,BrokenGlass,显然你的建议似乎是最乐观的。如果可能的话,我想避免完全重写代码。尽可能地重用代码将是首选方式。感谢回复。 - Bunkai.Satori

7
首先,这是移植而不是重构。我认为这是一个非常糟糕的想法。
虽然你可以(付出大量的努力)将C++移植到不安全的C#,但说语法非常相似有点牵强。实际上,按照同样的推理,你可以将C++移植到任何其他C衍生语言中,这同样是很痛苦的。
再次强调,如果你这么做,需要进行大量的重构工作。很可能比起使用现有代码作为模型从头开始重新编码更加麻烦和耗时,而在我看来,后者是更好、更清晰的选择。

嗨,JohnIdol,感谢您的纠正。完全重写应用程序是我害怕的事情。我知道我的问题是主观的。现在我明白了,将应用程序从C++移植到C#并不是那么简单的事情。 - Bunkai.Satori

3

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

但是,我怀疑您会发现该平台要求可验证的代码。这是平台限制代码仅使用.NET兼容语言的常见原因。由于指针操作,原生C ++转换为IL不可验证。如果是这种情况,那么您需要进行相当彻底的重写。


Dar Hans,感谢您的回答。目标平台是MS XNA。目前,我正在使用C++开发应用程序,但以后我希望将其移植到XNA。 - Bunkai.Satori
如果您实际上打算有一天在XBox上运行它,那么您不能使用原生的C++。对于桌面应用程序,则没有此限制。在这种情况下,我的建议是使用/clr构建应该可以很好地工作。 - Hans Passant
嗨汉斯,我的计划是在Windows Phone 7上运行移植的应用程序。 - Bunkai.Satori
你不能在Windows Phone上使用C++。无论你有什么现有的C++源代码都几乎没有用处。 - Hans Passant

0

我很想知道C#是哪个“唯一支持的平台”。

重新用一种新语言编写代码时,问题在于是否需要重新编写每个部分的代码,完全不能使用任何旧代码。有时候,即使进行重写,最好也是将其更改为一种重构:重写某些部分的代码,移动其他部分。现有代码已知可行,而且复制起来可能很麻烦,也会花费时间。必须有充分的理由才能进行完整的重写。

.NET支持C++的一个版本,Visual Studio也带有Visual C++以构建标准的C++,因此请考虑是否可以将其作为分阶段转换,并且是否真的需要完全重写整个项目。


你好CashCow,据我所知,微软的XNA框架只支持基于C#的应用程序。如果我错了,我会很高兴,但是,我甚至在谷歌上搜索了“C++ XNA”,但没有找到值得一提的东西。 - Bunkai.Satori

-2
将C++代码移植到C#并不难,前提是所有依赖库都有现成的C#替代品。缺乏依赖关系是最有可能的陷阱。程序的核心概念,如继承、堆、引用和数据结构,应该相当容易地进行转换。
这是基于假定您不会调用任何特定的低级行为,比如自定义内存管理,因为C#实际上不支持这种操作,你可能会在这里遇到严重问题。

3
许多C++结构(如位域,(部分)模板特化,非类型模板参数等)在C#中没有对应的。 "对于一小部分C ++"来说,“不会太难”只有在某些情况下才是正确的。 - Richard
@Richard,确实,C# 在位运算方面的表现真的非常差。 - kenny

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