背景情報
私は私に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からブール配列に変換する正しい方法は何ですか?