将项目从 C++ 转换为 C#

Posted

技术标签:

【中文标题】将项目从 C++ 转换为 C#【英文标题】:Converting a project from C++ to C# 【发布时间】:2009-06-22 15:17:35 【问题描述】:

我有一个目前用 C/C++ 编写的中型项目(回合制游戏)。只有一个人正在研究它。它将符合 /clr,虽然我没有尝试过 /clr:pure。

我正在寻找有关将其转换为 C# 的整个过程的建议。

它主要是 C 语言,上面有一层薄薄的 C++(C 语言带有静态/单例类用于范围界定)。是的,这不是“真正的”OO,我一直计划先进行 C# 转换,以避免在转换时产生任何转换问题。

它在寻路模块中对 STL(队列类)的使用非常有限,而且因为它是一个游戏,它也不会在 DLL 中的第三方声音库之外进行任何内存分配,以及什么是必要的用于加载图形位图。

我想把它转换成惯用的 C#。我宁愿不讨论这是否是一个好主意,我知道不是,让我们放手吧。请假设我有最重要的原因。

我也完成了我的研究,并且有一个线程与使用反射器转换方法有些相关。当我有机会时,我计划更深入地研究它。

Translate C++/CLI to C#

还有一个付费应用程序可以从 C++ 转换为 C#,如果它不能正常工作,我可以看看。

最困难的部分将是用 WPF/Silverlight 或 XNA(或两者兼有)重写界面。每种方法各有利弊,但由于字体支持,我现在倾向于 WPF,并且因为这样我就不必编写所有的小部件。我最终可能会同时做两个,一个 XNA 快速端口,一个 WPF。

对此有几种可能的方法,我想知道是否有人对这样的转换有任何经验,以及任何建议或陷阱。

1) 首先创建 UI,这包括将 Graphics 模块保持原样,从 GDI 转换为原始 GDI,如 XNA 中的调用,然后一次转换为 WPF 一个对话框。

2)先转换胆量,暂时将主UI留在C++/CLI中,胆量转换后,将界面一次一个对话框切换到WPF。

一个相关的问题是,是否值得一个模块一个模块地做这个,或者基本上一次做,以及粗略地转换成 C# 并清理所有东西,还是清理 C++ 中的所有东西然后转换成 C# 更好。

现在的想法是重写事件循环以使用像 MFC 这样的本地通用循环,然后尝试将所有内容立即转换为 C#。将图形留在 C++ 中,看看有什么问题。之后,移至 XNA 并稍后提供 WPF 层。最后两步是任意的,我认为XNA端口会更简单,但是使用WPF基本面板也可能很简单。

我愿意接受任何可能有帮助的建议。

谢谢, 拉尔夫

【问题讨论】:

我在考虑做同样的事情时发现了这篇文章,我很确定这与你七年前问的完全一样的回合制游戏。不过,我假设它无处可去。 我决定继续使用 C++。我编写了一个 UI 框架,而不是尝试将所有内容都更改为 C#。我应该在今年晚些时候发布。 我会期待的! 【参考方案1】:

我必须说,我能给你的最好的建议是重写应用程序。 C++ 和 C# 如此不同,如果您确定要转换整个内容,那么重写很可能是您的最佳选择。

我想我的主要问题是为什么要将这个项目转换为 C#?我知道这不是您的问题,但由于您正在承担我认为是相当 的工作,因此我希望您意识到自己正在做的事情。

【讨论】:

是的,我完全理解所涉及的工作量。我一直在做 C++,因为它从 1.0 开始就随便使用了 CFront 和 C#。我希望得到一些有意义的建议,但无论如何谢谢。 我并不是要让你失望,但我认为我已经提供了有意义的建议。任何人都不可能知道这个项目的深度并帮助你找出一个好的方法来攻击它。您希望将非托管应用程序更改为托管应用程序 - 这并非易事!如果我们知道为什么您想要切换,我们或许可以提供帮助。换句话说,如果您对使用 WPF 感到兴奋,那么我们可以建议您只重建 UI 并保留应用程序的其余部分。如果没有更多信息,除了“重写整个事情”之外,很难提供任何其他建议。 奇怪,由于某种原因,我没有收到您发表评论的通知。主要原因是我希望将这个程序维护 10 年以上,而我的日常工作是 C#。我也希望能够做 WPF 和可能的 XNA。整个 UI 需要被替换,然后清理它以便我可以使用 C# 处理一切,这非常简单。我希望有人做过类似的事情,并且可能会就对他们有用的方法提出建议。 (首先是 UI,一切都到 C#,然后 UI 到 WPF,C++ Native 到 DLL 与托管 C++ 首先等等。)我完全知道它有多少工作。【参考方案2】:

我发现 CodeRush(我已经拥有)有一个“智能粘贴”操作,可以合理地转换可以转换的内容。 googleplex 上还有一个 CR_Paste 插件,它可以做类似的事情(CR_Paste 插件可能不需要 Coderush,只需要免费的 DXCore 应用程序)。

由于我可以完全访问解析树(并理解解析树),我可能(也可能不会)对其进行自定义以将 char * 更改为字符串等。如果我进行大量自定义,我可能会创建一个开源版本,可能在 CodePlex 上。

【讨论】:

好的,这是我的暂定计划,稍后我会添加更多。 1) 将所有看起来像 unit_agility(the_unit) 的方法更改为 units[the_unit].agility()。那应该是实用图形功能之外的很多代码。 2) 将所有其他方法放入静态类中,以便稍后在 C# 中编译。 3) 将所有涉及 UI 的代码拆分为单独的“对话框”类。现在大部分都在同一个文件中,但应该很容易拆分。4) 将所有字符串转换为 std::string 并查看在使用 DXCore 将它们转换为 System::string (或进行全局搜索/替换。)【参考方案3】:

使用 Visual Studio 2013 Express

实际上,您可以打开它的两个窗口(比如说 VSEx 2013 (1) 和 VSEx 2013 (2))。

首先打开它,然后打开现有项目,然后:右键单击任务栏中的图标,然后单击 Visual Studio 2013 Express... 这将再次打开应用程序,您将让它同时运行两次。

因为我喜欢你的帖子的原因......哈哈......是因为我也在寻找同样的东西。

我接下来做的很好。

修改:全选 复制...

继续 VS Express 2013 的另一个“窗口”, 粘贴...

然后,当然,您可能会遇到一些小错误,例如必须重置颜色、重新定义表单以及所有 :: 和 -> 以“修改替换: :: by . and -> by . (You'虽然可能必须重新创建所有“事件”,但通常情况下:所有默认属性都将按照您在原始设置中的设置进行设置。

然后,如果您在粘贴时遇到错误(例如找不到对象),这主要意味着您的控件之一实际上是 .COM 或嵌入的东西... 只需像在旧版本的 Visual C++ 中一样添加它(例如:show : toolbox,然后右键单击它并添加 ITems(或选择项目),然后正常添加它)..

希望这会有所帮助。

(我实际上是在 C# 2013 中重做我所有的 VC++ 2010 程序。)

玩得开心:)

【讨论】:

枚举、结构和 联合 将特别注意,同时确定 *foo 是指向单个对象还是数组的指针...【参考方案4】:

我正忙于将 C++ 代码转换为 C# 代码。

我发现它比我想象的要快得多、容易得多。是的,我也首先希望它是相同的,然后在某些情况下进行更改,例如你想要相同输出的科学算法,如果不存在基准。

好吧,由于您的代码更多地基于 c,这只会为您提供 spagetti c# 代码,您需要稍后将其重构为类。我猜你最初会有很多静态方法,它们是你的 c 函数。尝试将一些描述对象行为的数据和方法捆绑在一起。

我正在逐个文件,逐行进行。从胆量开始。 当我发现某些内容完全过时时,我会使用 Lists 、 IEnumerables 等将其替换为 c# 等效项。一些低级计算可以替换为 C# 标准库。

我建议不要使用不安全的 C#。通常有一种更简单、更省钱的方法。指针计算通常可以保持与 C++ 代码非常相似,并且是一些翻译速度最快的东西。

例如

双*数组_p;

转换成

double[] array_p

现在只要你在 i 是 int 的地方引用了 array_p[i] ,代码就保持不变 如果你做了指针递增 array_p ++ ,请使用一个 int,你从 0 开始并递增。 例如我++。并调用

array_p[i]

将指针从一种方法传递到另一种方法,例如*array_p 只是在 c# 中传递对 array_p 的引用。本质上,在 c# 中,所有类在任何情况下都通过引用传递,因此没有太多需要拥有所有这些指针。

我会从头开始编写的 gui。 OO 和非 OO 实在是太不一样了。

祝你好运。测试底层代码并尽可能清理它。

【讨论】:

【参考方案5】:

听起来您需要重新设计应用程序,而不仅仅是代码转换。将非 OO C/C++ 应用程序转换为 C# 似乎不是一个现实的目标。

【讨论】:

【参考方案6】:
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) 
    char a;//letra
    int num;//cantidad a imprimir

    //Ingresa los datos
    cout<<"Introduce la letra "<<endl;
    cin>>a;
    cout<<"Introduce la cantidad para imprimir "<<endl;
    cin>>num;

    //imprime de 5 a 1
    for(int i=num; i>0; i--)
    
        for(int c=0; c<i; c++)
            cout<<a;
        cout<<endl;
    

    //imprime de 1 a 5
    for(int i=0; i<num; i++)
    
        for(int c=0; c<=i; c++)
            cout<<a;
        cout<<endl;
    
    return 0;

【讨论】:

以上是关于将项目从 C++ 转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章

将 C# 代表从 2005 项目转换为 C# 2003

如何将 .exe 从 C++ 项目复制到 C# 项目的输出目录?

如何将 VB 项目转换为 C# 项目 [关闭]

将 C++ 项目从 Visual Studio 2008 转换为 Visual Studio 2010

将代码从 C++ 转换为 C# 的问题

无法将 C++ 中的 TextBox_TextChanged() 转换为 C#