2

背景情報

私は私にaを返すCの関数を持っていますvoid*

2つのプロジェクト間の変換のテストを開始し、ポインターを割り当てtrueたりfalse、ポインターに割り当てたりして、C#に戻りIntPtr、関数を使用IntPtr.ToPointer()してバイトにキャストしました。これは、読んだ内容によると、c#のブール値に相当します。 。

これは私にとってはうまくいきました。

DLLIMPORT:

[DllImport(Library.ruta,
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr test_boolean(int flag);

関数の使用:

x = Library.test_boolean(1);

z = x.ToPointer();
Console.WriteLine("Prueba");

if (Convert.ToBoolean((byte)z))
    Console.WriteLine("True");
else
    Console.WriteLine("False");

問題
同じことを試みたが、ブール配列をポインターに割り当てたところ、C#でそれを取り戻すことができませんでした。

これはCの関数がどのように見えるかです

...
vpointer *chromosome;

chromosome = s_malloc(2*sizeof(boolean *));


if (flag == 1)
{
    chromosome[0] = true;
    chromosome[1] = true;
}
...
Return chromosome;

私がC#でやろうとしたこと:

(1)同じ「キャスト」を、今回はバイト配列に試しました。それは私にnull参照例外を与えました:

if (Convert.ToBoolean(((byte*)z)[1]))
    Console.WriteLine("True");
else
    Console.WriteLine("False");

(2)それがうまくいかなかったので、いくつかの調査の後、私はMarshal.Copy関数を試し、ポインタをバイト配列にコピーしました。今回は例外は発生していませんが、適切な結果は得られていません。つまり、たとえば、配列の最初のブール値がfalseの場合、trueになります。

C#コードは次のようになります。

x = Library.test_boolean(1);

byte [] managedArray = new byte[2];

Marshal.Copy(x, managedArray, 0, 2);

foreach (var qq in managedArray)
{
    Boolean a = Convert.ToBoolean(qq);
    Console.WriteLine(a.ToString());
}

質問
それで、私の質問は、C#のIntPtrからブール配列に変換する正しい方法は何ですか?

4

1 に答える 1

2

true… orをポインターに代入falseすると、C# に戻って を取得しIntPtr、関数を使用して、IntPtr.ToPointer()それをバイトにキャストしました…</p>

たとえそれがうまくいったとしても、それは間違っています。戻り値の型が の場合、void*実際にはブール値ではなくポインターである必要があります。そして、本当にこの残虐行為を実行したい場合は、ポインターを使用した中間ステップは必要ありません。. にIntPtr直接キャストできますbyte

bool[]さて、あなたの実際の質問に: 関数が常に 2 つのブール値の配列を返すことがわかっている場合は、適切な属性 ( のようなもの) を使用して C# で返すと宣言した方がよいと思います[return: MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1, SizeConst=2)]

ただし、C# コードも機能するはずです。問題はあなたのCコードにあると思います.あなたが返す配列は として宣言されています.vpointer*あなたのコメントによれば、これはvoid**. つまり、32 ビット マシンでは、C コンパイラはこの変数を 4 バイト値の配列として扱います。1 バイト値の配列として扱いたい場合は、そのように宣言する必要があります (例: boolean *chromosome;)。

于 2012-09-16T09:48:37.703 に答える