c# - 在保留结构的同时编码(marshal)它 "unmanaged"

标签 c# c pinvoke

我正在调用一个 DLL,该 DLL 返回一个 void** 结构指针列表,所有类型都相同。 From what I've read ,为了将我的结构从该列表中转换出来,该结构需要被视为非托管。我试图编码(marshal)的结构的主要罪魁祸首是来自 C 端的以下两个字段:

char name[1024];
int crop[4];

大多数指南建议在托管端的相应结构上使用 string 或 int[],但拥有这些字段会使其成为托管结构,因此无法从 void** 列表中提取。

还有什么方法可以整理这些字段,为我提供非托管结构?

最佳答案

如果您像这样声明它,该结构将在没有帮助或不需要 unsafe 关键字的情况下进行编码:

using System.Runtime.InteropServices;
...
  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  public struct Example {
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
    public string name;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    int[] crop;
  }

使用 Marshal.PtrToStructure() 将 void* 转换为结构体。

关于c# - 在保留结构的同时编码(marshal)它 "unmanaged",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2169255/

相关文章:

c# - 在不违反空接口(interface)规则的情况下创建协变泛型类型

c# - 如何在异常过滤器 Asp.Net Core 中获取模型对象?

c - 有没有一种简单的方法可以从文件中使用 SDL 创建字符串?

c# - 如何将 native C++ 内存转换为 C# 结构?

c# - 为什么 SendMessage 不通过

c# - 如何在单元测试 asp.net mvc 应用程序中模拟请求对象

c# - 二进制反序列化中的 NullReferenceException

c - C 编程中的 rand() 问题?

c - 如何使用函数动态分配字符串?

C# 如何在 struct 中使用 struct array 进行 P/Invoke?