我有一些C代码,将使用P / Invoke从C#调用。我有一个C结构成员,我试图定义一个C#等价物。
Array16 *data;
Array16定义为
typedef unsigned char Array16[16];
如何定义此C数据成员的C#等价物?
答案 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。