1

C# アプリケーションから、VC++ DLL からエクスポートされた関数に InParameter を渡す必要があります。この関数は 2 つのパラメーターを受け入れます。

int func_name (FILE* fp, BYTE& by);

fpIn およびbyOut パラメータです。

IntPtrforFILE*を使用し、 byte を使用してマーシャリングすることを考えていましたBYTE。それが正しいか?C#で次のように書くと

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

それはうまくいきますか?マーシャリングステートメントの「&」記号でエラーが発生すると思います。out パラメーターを参照渡しするにはどうすればよいですか?

どうぞよろしくお願いいたします。

ありがとう、ヴィレン

4

2 に答える 2

2

いいえ、これは書かれたとおりには機能しません。

  1. FILE*C# プログラムのどこで を取得しますか? アンマネージ dll の他の関数がこのポインターを提供しない限り、問題が発生します。ところで、これFILE*SafeHandle;でラップすることを強くお勧めします。その場合、 p/invoke 署名はSafeFilePointerベアの代わりに aを使用しIntPtrます。
  2. 何バイトをマーシャリングしていますか?1 つだけの場合out byte byは、マネージド シグネチャを入力します (属性は必要ありません)。
  3. chars またはsをマーシャリングしていないため、文字セットを指定する必要はありませんstring
于 2009-07-31T14:11:10.257 に答える
1

ネイティブ関数が参照を予期している場合は、ref/out を使用してマーシャリングできます。したがって、あなたの状況では、次を使用できます out byte by。私はそれをチェックしました、そしてそれは私のために働きます。

もう一度編集: FILE は構造体であるため、C# から簡単にマーシャリングすることはできないため、私があなたに提供したアドバイスはうまくいかないことが頭に浮かびました。アンマネージ ライブラリ内の HANDLE オブジェクトとして SafeFileHandle を脅かす場合は、このアプローチを使用できます。この dll を変更できない場合、解決策の 1 つは、stdio を使用してファイルを作成するための独自のラッパーを作成することです。次のようになります。

  1. fopen、fclose などの機能を公開するライブラリを作成します。(C++):
    FILE* CreateFile(char* 名);
  2. この関数をマーホールします。この例では、(c#) を使用します。
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] 文字列名);
  3. すべての FILE* パラメータを IntPtr にマーシャリングし、関数の結果を CreateMyFileFILE* として渡すだけです。
于 2009-07-31T14:21:09.660 に答える