簡體   English   中英

將項目從 C++ 轉換為 C#

[英]Converting a project from C++ to C#

我有一個目前用 C/C++ 編寫的中等規模項目(一個回合制游戲)。 只有一個人在做這件事。 它將符合 /clr,雖然我還沒有嘗試過 /clr:pure。

我正在尋找有關將其轉換為 C# 的整個過程的建議。

它主要是帶有 C++ 薄飾面的 C(C 帶有用於范圍界定的靜態/單例類)。 是的,這不是“真正的”OO,我一直計划先進行 C# 轉換,以避免在轉換時產生任何轉換問題。

它在尋路模塊中對 STL(隊列類)的使用非常有限,並且因為它是一個游戲,它也不會在 DLL 中的第三方聲音庫之外進行任何內存分配,以及加載所需的內容圖形位圖。

我想把它轉換成慣用的 C#。 我寧願不討論這是否是一個好主意,我知道它不是,讓我們放手吧。 請假設我有壓倒一切的理由。

我也做了我的研究,有一個線程與使用反射器轉換方法有些相關。 我計划有機會時更深入地研究它。

將 C++/CLI 轉換為 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++ 和 C# 是如此不同,如果您確定要轉換整個內容,那么重寫很可能是您的最佳選擇。

我想我的主要問題是為什么要將此項目轉換為 C# 我知道這不是您的問題,但由於您正在進行我認為是相當大的努力來做到這一點,我希望您意識到自己在做什么。

我發現 CodeRush(我已經擁有)有一個“智能粘貼”操作,它可以合理地轉換可以轉換的內容。 googleplex 上還有一個 CR_Paste 插件,它執行類似的操作(CR_Paste 插件可能不需要 Coderush,只需要免費的 DXCore 應用程序)。

由於我可以完全訪問解析樹(並了解解析樹),因此我可能(也可能不會)對其進行自定義以將 char * 更改為 String 等。如果我進行了大量自定義,我可能會創建一個開源版本,可能在 CodePlex 上。

使用 Visual Studio 2013 Express

實際上,您可以打開它的兩個窗口(比如 VSEx 2013 (1) 和 VSEx 2013 (2))。

首先打開它,然后打開現有項目,然后:右鍵單擊任務欄中的圖標,然后單擊 Visual Studio 2013 Express...這將第二次打開應用程序,您將在同一時間。

因為我落在你的帖子上的原因......哈哈......是因為我正在尋找同樣的東西。

我接下來做的很好。

修改:全選復制...

繼續 VS Express 2013 的另一個“窗口”,粘貼...

然后,當然,您可能會遇到一些小錯誤,例如必須重置顏色,重新定義表單,以及所有 :: 和 -> 以“修改替換 :: :: by . 和 -> by .(您可能有雖然要重新創建所有“事件”,但通常情況下:所有默認屬性都將在您在原始設置上設置它們時進行設置。

然后,如果您在粘貼時遇到錯誤(找不到對象),這主要意味着您的控件之一實際上是 .COM 或嵌入的東西......只需像在舊版本的 Visual C++ 中一樣添加它(例如:顯示:工具箱,然后右鍵單擊它並添加項目(或選擇項目),然后正常添加)。

希望這可以幫助。

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

玩得開心 :)

我正忙於將 C++ 代碼轉換為 C# 代碼。

我發現它比我想象的更快更容易。 是的,如果不存在基准,我也首先希望它在某些情況下進行更改之前是相同的,例如您想要相同輸出的科學算法。

好吧,因為您的代碼更多地基於 c,所以這只會為您提供意大利面條 c# 代碼,您稍后需要將這些代碼重構為類。 我猜你最初會有很多靜態方法,它們是你的 c 函數。 嘗試將一些描述對象行為的數據和方法捆綁在一起。

我正在逐個文件,一行一行地做。 從膽量開始。 當我發現一些完全過時的東西時,我將它替換為 C# 等效項,使用 Lists 、 IEnumerables 等。一些低級計算可以替換為 C# 標准庫。

我建議不要使用不安全的 C#。 通常有一種更簡單、更省錢的方法來解決它。 指針計算通常可以保持與 C++ 代碼非常相似,並且是一些轉換速度最快的東西。

例如

雙* array_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 對此差別太大了。

祝你好運。 測試低級代碼並在可能的情況下對其進行清理。

聽起來您需要重新設計應用程序,而不僅僅是代碼轉換。 將非 OO C/C++ 應用程序轉換為 C# 似乎不是一個現實的目標。

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM