将未管理的C++项目移植到C#中

问题描述 投票:3回答:3

我需要将一个CC++非托管项目(VS 2008)移植到C#中(最好是.net 3.5).是否有任何转换帮助工具;比方说翻译代码语法的东西,并要求你对每个问题点进行验证修改(我想我在做梦...)

我在哪里可以找到一些关于这种翻译的有用的howtos或文章。如果它们包含特定的提示,那将是非常有用的,比如。

extern variables 应该设置在公共静态类中

(我不知道,我猜测...)

请不要提出 "你可以从.net调用你的c++ dll "这样的建议,因为我知道这是有可能的,但我就是做不到。

  • CC++项目只使用STL和其他基本功能,没有第三方库等。
  • 我不能直接使用,也不能从C#中封装出来,因为我们公司需要对代码进行维护修改,而且我们对C#比对C++极其熟练。
c# c++ unmanaged porting
3个回答
3
投票

你转换的成本要远远高于每隔几个月(或者每隔几年)需要修改C++代码时,包给一个自由职业者(比如我)帮你修改。有一些机械的方法,但更大的问题是,你永远无法真正确定新的C#代码与旧的C++代码完全一样。我有客户尝试过这种方法,但大多数客户都放弃了,并把工作扔掉了。那些成功的人做得很慢,像这样。

首先,你把旧的库包起来,然后让你的UI或任何新的代码(web服务之类的)成功地调用旧的库。这让大家都得到一些 "实惠",并为你争取时间解决 "我们无法维护旧代码 "的问题。你还开发了一个全面的测试套件,以证明旧库对各种边缘情况和奇怪的事情所做的事情,这些事情每隔几年才会发生。随着时间的推移,你将旧库中的功能移到新的C#库中,并改变调用代码以使用新库中的功能。你先把最不稳定的部分,也就是你最经常改变的东西移出来。在每一个阶段,你都要再次运行测试用例,以确保你从C++到C#的翻译没有搞乱它计算的结果。也许有些东西你从来没有搬出来过,也许到最后都被搬走了。当你觉得无法维护自己的库而需要付钱给别人帮你维护的风险已经降到了继续翻译的成本之下时,你就会停止。

我建议你在开始的时候,能够接触到一个有良好C++技能的人。你可能会遇到一些对你来说没什么意义的事情。但你可以很快从库中获得价值,而且从长远来看,还是可以解决你的底层问题。


1
投票

这要看你说的移植是什么意思。

你可以用C#重写一些东西。但不是所有的东西。即使你移植自己的代码,一些HW或遗留库也必须用CC++处理。我不知道有什么可靠的C++->C#的自动转换器,我怀疑是否存在。

一个更好的主意可能是把你现有的代码包在新的C#代码中。例如,你可以在C++CLI中创建一个互操作层。或者你可以用类似Google Protocol Buffers这样的东西与你的本地代码进行通信,如果你不想在同一个过程中混合本地管理的代码。


1
投票

我怀疑代码转换工具会有帮助。如果你需要让一些C++以某种方式与.NET一起工作,最简单的方法是写一个托管的C++层,把它包装起来,并提供一个接口让.NET应用程序使用。但这要看代码的情况。

重写的目的是什么,你的代码是做什么的?它是否与其他组件有接口?它有GUI吗?它是一个独立的可执行文件还是一个库?它是一个COM ActiveX服务器还是使用COM组件?它是否链接到其他DLLs或使用第三方库?

所有这些都会影响你如何从头开始移植重写你的应用程序。例如,如果你的代码是一个MFC应用,你可能会忘记试图挽救很多代码。如果你的应用做的是http高级网络的东西,你不妨从头开始写。如果你的代码是低级的,你可能不得不用一些C#和一些C++通过管理的C++层来重构。

很多选择,这真的取决于你的应用在做什么,它是如何编写的等等。

© www.soinside.com 2019 - 2024. All rights reserved.