gpt4 book ai didi

c# - 具有未指定长度数组的 PInvoke 结构

转载 作者:太空狗 更新时间:2023-10-29 23:24:12 25 4
gpt4 key购买 nike

C 定义

typedef struct {
const uint8_t* buf;
int bufLen;
} Info;


int Foo(Info* info);

C# 定义

[StructLayout(LayoutKind.Sequential)]
public struct Info
{
// [MarshalAs( ??? )]
public byte[] buf;
int bufLen
}

[DllImport(...)]
public static extern int Foo(ref Info info);

我无法确定在 C# 结构定义中为 byte[] bufMarshalAs 属性指定什么。缓冲区在 .NET 端分配,其长度在调用时已知。

在一个简单的小测试中:

var info = new Info {
buf = new byte[] {0x40, 0x50, 0x60, 0x70},
bufLen = 4,
};

Foo(ref info);

一切似乎都在正常工作,但实际上我缓冲区中的数据是不正确的。从 DLL 打印出来我看到 01 00 80 00 - 不确定那是什么。

我试过:

  • 没有 MarshalAs
  • [MarshalAs(UnmanagedType.SafeArray)]

没有任何效果。

一般来说,我也不知道调试这类问题的最佳方法。

最佳答案

根据 Hans Passant 的建议,我实现了以下内容:

[StructLayout(LayoutKind.Sequential)]
public struct Info : IDisposable
{
private IntPtr buf;
private int bufLen;

public Info(byte[] buf) : this() {
this.buf = Marshal.AllocHGlobal(buf.Length);
Marshal.Copy(buf, 0, this.buf, buf.Length);
this.bufLen = buf.Length;
}

public void Dispose() {
if (buf != IntPtr.Zero) {
Marshal.FreeHGlobal(buf);
buf= IntPtr.Zero;
}
}
}

关于c# - 具有未指定长度数组的 PInvoke 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15605483/

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