编程语言
首页 > 编程语言> > 如何将C数组映射到C#?

如何将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