我正在调用一个 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/