2009-09-01 9 views

答えて

2

一般的にはこれがある本当にハード、C#のよりさまざまな機能を提供++ Cので: テンプレートなど友人、ゼロ終端文字列、管理されていないポインタ、COMを、 は、C++をパースするの雌犬であることは言うまでもありません仕事。

これを実行するには、名前と型の解決を含む完全なC++パーサー、それぞれの構造(問題のあるかないか)を等価なC#コードに変換する方法、これらのアイデアを自動翻訳ステップにエンコードする手段、そしてコードのうち翻訳がうまくいかない部分(通常は "手作業で修正する")で何をすべきかについての計画です。すべての必要な機械を提供DMS Software Reengineering Toolkitを使用

は、 私の会社、セマンティックデザインは、実際にそのようなツールを構築しますが、C#のにC++の800K SLOCを移動したい大規模な顧客のために、それを使ったことがありません。プロジェクトの方法の約2/3は、顧客が鳥かご管理の改造をしていたため、新しい管理者は、費用を節約するために進めないことにしました(ツール自体はうまくいっていました)。

+0

音が面白いです:) –

+0

結果のコードはどのようにメンテナンス可能で慣用的ですか?私は機械翻訳されたコードベースで時間を過ごしました。私は元の言語を使いたいと思っていました。 「本当のプログラマーがFORTRANをどの言語でも書くことができれば」、FORTRANからの自動翻訳は「目標」をうまく満たすことに成功します。 – AProgrammer

+0

悪い翻訳者を簡単に作成できます:個々の言語演算子をコンテキストに関係なくターゲット言語に直接マッピングするだけです。言語構造をマッピングする必要がありますが、アカウントコンテキストを利用することができます(DMSはアプリケーション全体からファクトを収集し、各ポイントで生成されたものを制御するために使用できます)。どちらの手法でも、コードはより保守性に優れています。 –

1

あなたはそのAPIの宣言が必要ですか?あなたが使用できるPInvoke Interop Assistantと呼ばれるツールがありますが、私は個人的に私はDIYのアプローチを好む。それほど難しいことではありません。

あなたがC#にC++コードを移植している場合は、次の定義

struct EFS_CERTIFICATE_BLOB 
{ 
    public int dwCertEncodingType; 
    public int cbData; 
    public IntPtr pbData; 
} 

struct ENCRYPTION_CERTIFICATE 
{ 
    public int cbTotalLength; 
    public IntPtr pUserSid; 
    public IntPtr pCertBlob; 
} 

struct ENCRYPTION_CERTIFICATE_LIST 
{ 
    public int nUsers; 
    public IntPtr pUsers; 
} 

[DllImport("advapi32.dll", CharSet=CharSet.Unicode)] 
static extern uint AddUsersToEncryptedFile(string lpFileName, ref ENCRYPTION_CERTIFICATE_LIST pUsers); 
+0

@Mattias s - 全コードリストは、このサイトにあります http://msdn.microsoft.com/en-us/library/aa363765(VS.85).aspx –

1

を試してみてください、あなたはおそらく、C++/CLIに管理されていないC++コードを変換する検討すべきです。その後、より制御されたマナーで(つまり、一度に1つずつ、理想的にはユニットテストを行って)、C#に移植することができます。

C++/CLIに変換する代わりに、SWIGを使用して既存のアンマネージC++コードをラップすることもできますが、この方法を使用すると移行がより困難になります。

2

あなたはこの話が面白い見つけることがあります。

Disclosing How C#-SQLite Was Ported to .NET

SQLiteはCプログラムですが、いくつかの良いハイレベルのヒントがここにあります。

関連する問題