4

C# コードからの C DLL 関数の呼び出しに問題があります。C DLL には、ファイル名 ( ) を受け入れる関数const char *があり、ファイルを開き、コンテンツに対して何らかの作業を実行し ( を読み取ってFILE *)、結果を別のファイルに書き込みます。C# アプリのメモリ ストリームで既に処理するファイルがあるため、ディスクの読み取り/書き込み操作が実行されないように最適化したいと思います。両端 (C# アプリと C DLL) を自由に変更できます。C# アプリは .NET 2.0 ベースです。

DLL を拡張して、バイト配列を受け入れて吐き出す機能を持たせ、簡単にできるようにすることをPInvoke考えました。出力部分は C 側では簡単に見えます - に書き込む代わりにFILE *、連続するバイトを配列に保存するだけで済みます - しかし、入力は難しいようです。取得したバイト配列を C 側で処理してメモリ ストリームにし、代わりにこの時点から物理ファイル ストリームで作業する方法がわかりません (DLL 全体を読み書きするのは嫌です)。代わりにバイト配列からFILE *- ラップしてイン/アウトを微調整するためだけに、ほとんどの DLL 内部を変更しないままにしておきたい)。しかし、実際にはわかりません。おそらくそれを行うためのより良いアイデアがあります。

問題、C のバイト配列を(FILE *)実際にディスクに書き込み、a を開いてFILE *このファイルを読み取る ことなく、バイト配列を a に変換する方法です。の方法: C# から C DLL にメモリ ストリームを渡してPInvoke、C 側で簡単に認識し、FILE *(物理ディスクの書き込み/読み取りなしで、インメモリのみで) として操作できるようにする方法は?

4

1 に答える 1

1

Windows の名前付きパイプは、メモリ バッファーを介して処理され、ほとんどのファイル API と互換性があります。パイプを操作するには、"\\.\pipe" 名前空間を使用します。たとえば、"\\.\pipe\foo" のような名前です。パイプを作成するには、CreateNamedPipe Win32 API を使用します。fopen を使用して C 側で開きます。

もう 1 つの代替手段は、CreateMailSlot API によって作成され、"\\.\mailslot" 名前空間を介して操作されるメールスロットです。主な違いは、パイプの場合のようにストリームではなく、データグラム レベルで動作することです。

于 2012-12-23T02:43:47.887 に答える