指向C#的unsigned char数组指针

时间:2012-10-29 19:32:20

标签: c# pinvoke

我有一些C代码,将使用P / Invoke从C#调用。我有一个C结构成员,我试图定义一个C#等价物。

Array16 *data;

Array16定义为

typedef unsigned char Array16[16];

如何定义此C数据成员的C#等价物?

2 个答案:

答案 0 :(得分:1)

我猜你的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);

答案 1 :(得分:0)

C#中与C ++ unsigned char最接近的类型是byte。