P/Invoke を使用して C# から呼び出される C コードがいくつかあります。C# に相当するものを定義しようとしている C 構造体メンバーがあります。
Array16 *data;
Array16 は次のように定義されます。
typedef unsigned char Array16[16];
この C データ メンバーに相当する C# を定義するにはどうすればよいですか?
あなたのC構造体は次のようになると思います:
struct MyStruct {
Array16 *data;
};
ペイロードへの参照のため、p/invoke マーシャラーに作業を任せることができるとは思えません。手でマーシャリングする必要があります。
C# コードでは、次のように構造体を宣言します。
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
IntPtr data;
}
関数呼び出しのためにそのような構造体を準備する必要がある場合は、次のようにします。
MyStruct s;
s.data = Marshal.AllocHGlobal(16);
byte[] bytes = Encoding.Default.GetBytes("some string data");
Marshal.Copy(bytes, 0, s.data, Math.Min(16, bytes.Length));
関数によって返されたデータを読み取る必要がある場合は、同じ戦術を逆方向に使用します。
int nbytes = ... // probably returned by the function, no more than 16
byte[] bytes = new bytes[nbytes];
Marshal.Copy(s.data, bytes, 0, nbytes);
string returnedString = Encoding.Default.GetString(bytes);
構造体を使い終わったら、呼び出してメモリの割り当てを解除してください。
Marshal.FreeHGlobal(s.data);
C#のC ++unsignedcharに最も近い型はbyteです。