gpt4 book ai didi

c# - 当结构包含整数数组时,如何避免在 PInvoke 编码期间进行复制?

转载 作者:行者123 更新时间:2023-12-04 05:56:44 26 4
gpt4 key购买 nike

我有一个“C”结构,它被定义为:

typedef unsigned char tUI8;

typedef struct
{
tUI8 Mode;
tUI8 Data[16];
} TestStruct;

还有一个函数,它接受一个指向这个结构的指针并填充数据:
void FillTest(tUI8 Mode, TestStruct *s);

为了调用此函数,我将 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 签名,以避免在编码期间复制数据?

最佳答案

我怀疑你想要一个 fixed size buffer ,这将内联结构中的数据:

[StructLayout(LayoutKind.Sequential)]
unsafe struct TestStruct
{
public byte Mode;
public fixed byte Data[16];
}

您现在应该能够通过引用直接将其传递给您的非托管代码。 (您还需要明确允许不安全代码。)

我不知道您需要使用哪些属性进行编码(如果有),但值得一试......

关于c# - 当结构包含整数数组时,如何避免在 PInvoke 编码期间进行复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9426662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com