如何将C数组映射到C#?
作者:互联网
我的问题与尝试从C#调用用C编写的函数有关.我查看了C库附带的头文件,以了解C dll中存在的功能.这是我看到的:
C代码(用于名为“ LocGetLocations”的函数):
typedef enum {
eLocNoError,
eLocInvalidCriteria,
eLocNoMatch,
eLocNoMoreLocations,
eLocConnectionError,
eLocContextError,
eLocMemoryError
} tLocGetStatus;
typedef void *tLocFindCtx;
typedef void *tLocation;
PREFIX unsigned int POSTFIX LocGetLocations
(
tLocFindCtx pCtx,
tLocation *pLoc,
unsigned int pNumLocations,
tLocGetStatus *pStatus
);
在C#中,我有这个:
[DllImport(@"VertexNative\Location.dll")]
public static extern uint LocGetLocations(IntPtr findContext, out byte[] locations, uint numberLocations, out int status);
问题是我不太了解如何在C#中处理pLoc参数.我将其作为字节数组移交给我,尽管我不确定那是否正确. C库的文档说该参数是指向句柄数组的指针.
我如何才能在C#端获取数组并访问其数据?
我用C语言给出的示例如下所示:
tLocation lLocation[20];
// other stuff
LocGetLocations(lCtx, lLocation, 20, &lStatus)
任何帮助将非常感激!
解决方法:
通常,唯一重要的是参数的大小.我记得枚举是C中的整数,因此您可以简单地使用它.或者更好的是,在C#中重新创建相同的枚举,我认为它会起作用.要记住的一件事是,在处理复杂的结构时,需要使用属性来告知框架有关成员期望的对齐方式.
标签:interop,marshalling,c,c-4,pinvoke 来源: https://codeday.me/bug/20191208/2095069.html