質問
C#アプリケーションからInParameterをVC ++ DLLからエクスポートされた関数に渡す必要があります。この関数は2つのパラメーターを受け入れます:
int func_name (FILE* fp, BYTE& by);
fp
はInパラメーターで、 by
はOutパラメーターです。
FILE *
に IntPtr
を使用し、 BYTE
にバイトを使用してマーシャリングすることを考えていました。それが正しいか? C#で次のように記述した場合
[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);
動作しますか? 「&」のエラーになると思いますマーシャリングステートメントにサインインします。参照によってoutパラメーターを渡すにはどうすればよいですか
ご協力いただければ幸いです。
ありがとう、Viren
解決
ネイティブ関数が参照を必要とする場合、ref / outを使用してそれをマーシャリングできます。だからあなたの状況では、あなたは使用することができます:
out byte by
。私はそれをチェックしました、そしてそれは私のために働きます。
再編集: FILEは構造体であり、C#から簡単にマーシャリングできないというアドバイスは機能しません。アンマネージライブラリ内のHANDLEオブジェクトとしてSafeFileHandleを脅かす場合は、これらをスクラッチして、このアプローチを使用できます。このdllを変更できない場合、1つの解決策は、stdioを使用してファイルを作成するための独自のラッパーを作成することです。次のようになります。
- fopen、fcloseなどの機能を公開するライブラリを作成します。Fe。 (C ++):
FILE* CreateFile(char* name);
- この関数をマーシャルします。この例では(c#)を使用します。
public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
- すべてのFILE *パラメーターをIntPtrにマーシャルし、関数
CreateMyFile
の結果をFILE *として渡すだけです。
他のヒント
いいえ、これは書面通りには機能しません。
- C#プログラムのどこで
FILE *
を取得しますか?アンマネージdllの他の関数がこのポインターを提供しない限り、問題が発生しています。ところで、SafeHandle
; p / invoke署名は、裸のIntPtr
ではなく、SafeFilePointer
を使用します。 - マーシャリングしているバイト数は? 1つだけの場合は、マネージド署名に
out byte by
を入力します(属性は不要です)。 -
char
sまたはstring
sをマーシャリングしていないため、charsetを指定する必要はありません。
所属していません StackOverflow