3

既存のC#アプリケーションがあります。私が欲しいのは、速度を向上させるためにc#アプリケーションの一部にネイティブコードを記述し、別の部分ではC#アプリを使用し、他の部分ではC ++ / CLIを使用してC#アプリケーションへのインターフェイスを提供することです。したがって、後半では、C#コードをC ++/CLIに変換する必要があります。

C#コードをC ++/CLIコードに変換できるかどうか疑問に思っています。たぶん、.netアセンブリをC ++ / CLIに変換することは、特定のコードを取得するためのより良いアイデアでしょう。リフレクターとそのアドインCppCliを調べました。しかし、アドインはもう利用できません。だから私はこれを自動化する方法を探しています。アドバイスをいただければ幸いです。

4

2 に答える 2

3

一般的に言えば、C++/CLI のランタイムは C# とほぼ同じです (どちらも管理されており、おそらく同じ IL に変換されます)。アプリケーションの特定の部分をより高速に実行する必要がある場合は、C++/CLI レイヤーを記述して、C# アプリがネイティブ C++ と相互運用できるようにすることができます。ネイティブ C++ を適切に記述すれば、これはより高速になります。

編集: Ben Voigt が指摘したように、C++/CLI は C# よりも最適化されている可能性がありますが、まだ管理されているため、適切に作成されたネイティブ C++ ほど高速ではありません。

ネイティブ コードを C++/CLI でラップしようとしている場合、変換ツールはおそらくそれを有用な方法で構造化しないでしょう。相互運用部分を手作業でコーディングしたほうがよいでしょう。

これを行う商用ツールがありますが、手動で行う方がよいと思います。

于 2012-09-13T17:16:25.407 に答える
1

コードを変換する必要がない場合があります。

C++ コンパイラ ツールの一部である link.exe は、C++ コードと C# コードの両方を同じアセンブリに含めることができます。C++ ビットには、マネージ コードとアンマネージ コードを混在させることができます。最初に、C# コンパイラ (csc.exe) のコマンド ライン スイッチを使用して C# コードを .netmodule にコンパイルする必要があります。次に、link.exe を使用して、C++ コードでアセンブリにコンパイルできます。混合言語アセンブリを作成してからしばらく経ちます。詳細が 100% でな​​い場合は申し訳ありませんが、上記の用語を検索すると、それを行う方法が見つかります。

重要な部分は、C++ コンパイラが他のコンパイラよりも高度であるため、C#/VB ネットモジュールを使用できるが、その逆ではないことを覚えていることです。別のアセンブリを参照するのではなく、単一のアセンブリにコンパイルすることの利点は、単一のアセンブリの各部分内の型が相互参照できることです。2 つの別個のアセンブリ間で参照を持つことにより、型認識の関係は階層的でなければなりません。

C# にはunsafeキーワードもあります。これにより、C++ スタイルのポインターを C# コード ファイルのセクション内で使用できるようになり、配列の境界チェックがオフになります。これには欠点があり、使用シナリオによっては問題になる場合と問題にならない場合があります。

個人的には、C++ で利用可能なポインターを使用して最適化した後、計算集約型のコードを実行すると、C# と比較して C++ コンパイラーの方が 20 倍高速であることがわかりました。

于 2012-09-13T19:10:25.290 に答える