1

我有一些 C 代码将使用 P/Invoke 从 C# 调用。我有一个 C 结构成员,我正在尝试为其定义一个 C# 等效项。

Array16 *data;

Array16 定义为

typedef unsigned char Array16[16];

如何定义此 C 数据成员的 C# 等效项?

4

2 回答 2

1

我猜你的 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);
于 2012-10-29T20:19:58.363 回答
0

C# 中最接近 C++ 无符号字符的类型是字节。

于 2012-10-29T19:45:09.487 回答