【发布时间】:2016-02-22 19:30:39
【问题描述】:
我有一个“C”结构,定义为:
typedef unsigned char tUI8;
typedef struct
{
tUI8 Mode;
tUI8 Data[16];
} TestStruct;
还有一个函数,它接受一个指向这个结构的指针并填充数据:
void FillTest(tUI8 Mode, TestStruct *s);
为了 PInvoke 到这个函数,我将 C# 代码编写为:
[StructLayout(LayoutKind.Sequential)]
struct TestStruct
{
public byte Mode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Data;
}
static class NativeTest
{
[DllImport("Native.dll")]
public static extern void FillTest(byte mode, ref TestStruct s);
}
这可行,但我怀疑在 PInvoke 编组器在调用期间复制结构并返回而不是固定它。我可以这么说,因为即使我不初始化结构,它也可以正常工作。
TestStruct s;
//here s.Data == null!
NativeTest.FillTest(10, ref s); //<<< I expected an error here
//here s.Data points to a valid byte[] of length 16
Console.WriteLine(BitConverter.ToString(s.Data));
我的问题是如何使用结构或类定义 PInvoke 签名,从而避免在编组期间复制数据?
【问题讨论】:
标签: c# .net pinvoke marshalling