質問

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を使用してファイルを作成するための独自のラッパーを作成することです。次のようになります。

  1. fopen、fcloseなどの機能を公開するライブラリを作成します。Fe。 (C ++):
    FILE* CreateFile(char* name);
  2. この関数をマーシャルします。この例では(c#)を使用します。
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. すべてのFILE *パラメーターをIntPtrにマーシャルし、関数 CreateMyFile の結果をFILE *として渡すだけです。

他のヒント

いいえ、これは書面通りには機能しません。

  1. C#プログラムのどこで FILE * を取得しますか?アンマネージdllの他の関数がこのポインターを提供しない限り、問題が発生しています。ところで、 SafeHandle ; p / invoke署名は、裸の IntPtr ではなく、 SafeFilePointer を使用します。
  2. マーシャリングしているバイト数は? 1つだけの場合は、マネージド署名に out byte by を入力します(属性は不要です)。
  3. char sまたは string sをマーシャリングしていないため、charsetを指定する必要はありません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top