3

符号なしの長い配列へのポインターを使用して(データを操作)、それをC#に送り返します

C#で

[DllImport("some_dll.dll")]
private static extern uint[] func(uint[]x, uint[]y, uint[]z);

Cヘッダー

_declspec(dllexport) unsigned long* _stdcall func(unsigned long[],
    unsigned long[],unsigned long[]);

エラー

MarshalDirectiveException
'戻り値'をマーシャリングできません:管理されたタイプと管理されていないタイプの組み合わせが無効です

問題の原因を教えてください。

4

1 に答える 1

4

このメッセージは、p/invoke マーシャラーがその戻り値を にマーシャリングできないことを意味しますuint[]

ご覧のとおり、次のオプションがあります。

  1. C# 関数を return として宣言しますIntPtruint[]次に、マネージ側で、C# コードで割り当てられたメモリにメモリをコピーする必要があります。そのために使用できますMarshal.Copy。どういうわけか、配列の長さを調べる必要があります。割り当て解除も処理する必要があります。あなたの C# コードではそれができません。そのため、ネイティブ コードで別の関数を呼び出して、ネイティブ コードに割り当て解除を要求する必要があります。
  2. uint[]ネイティブ コードへの呼び出しの前に、C# コードで を割り当てます。関数の戻り値を使用する代わりに、をuint[]パラメーターとして渡します。これには、呼び出しコードである C# コードが、必要な配列の大きさを知る必要があります。

オプション 2 を選択できる場合は、インターフェースの両側でより単純なコードになります。私の推測では、戻り配列は入力配列と同じ長さです。その場合、オプション 2 を選択します。

于 2012-12-23T19:42:04.340 に答える