COM Iterop を使用せずに、C# オブジェクトを作成し、アンマネージ C++ からメソッドを呼び出す方法はありますか? VMを手動で作成したり、オブジェクトを作成したりできるJNIのようなものを探しています(ただし.Net用)。
4 に答える
C++/CLI を使用している場合は、マネージ コードとアンマネージ コードの両方と直接やり取りできるため、相互運用性は簡単です。
また、CLR を自分でホストすることもできます。ホスティング API は COM ベースですが、任意のマネージド オブジェクトを作成できます。いくつかの API 呼び出しが多くの機能をカプセル化しているように聞こえるので、このプロセスは難しくありません。「 Hosting the Common Language Runtime 」に関する MSDN ドキュメントなど、オンラインには多くの情報があります。
.NET クラス/メソッドから C スタイルの API をエクスポートする「文書化されていない」方法があります。
これは最終的に、.NET dll が、C/C++ から呼び出すことができる API をエクスポートしたり、そのために .DLL を消費できるものからエクスポートしたりする状況につながります。
「読書」が好きなら (beh ;)、Inside Microsoft® .NET IL Assemblerという本を入手できます。このテクニックは、第 15 章「Managed Methods as Unmanaged Exports」にあります。
コード プロジェクトには、32 ビット環境の開始点として使用できる優れたサンプル プロジェクトもあります: http://www.codeproject.com/KB/dotnet/DllExport.aspx
私は、JVM と CLR の間のオープン ソース イントラプロセス ブリッジであるjni4netの作成者です。JNI と PInvoke の上に構築されています。C/C++ コードは必要ありません。お役に立てば幸いです。
マネージ C++ を使用するかどうかは、C++ プロジェクトでファイルごとに決定できます。プロジェクト内のファイルの設定を変更して、マネージとしてコンパイルされるようにしてください。そこに呼び出しを C# オブジェクトに配置します。
C++/C# の境界を越えるにはコストがかかるため、どこでそれを行うかを分析する必要があります。同様に、ループ内で実行したくないでしょう。