我有一些 C 代码将使用 P/Invoke 从 C# 调用。我有一个 C 结构成员,我正在尝试为其定义一个 C# 等效项。
Array16 *data;
Array16 定义为
typedef unsigned char Array16[16];
如何定义此 C 数据成员的 C# 等效项?
我猜你的 C 结构看起来像这样:
struct MyStruct {
Array16 *data;
};
由于对有效负载的引用,我不相信您可以让 p/invoke marshaler 为您完成工作。你需要手动编组。
在 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++ 无符号字符的类型是字节。