c# - 如何将 C 数组映射到 C#?

标签 c# c++ interop pinvoke marshalling

我的问题与尝试从 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# 中重新创建相同的枚举,我认为它会起作用。需要记住的一件事是,在处理复杂的结构时,需要使用属性来告知框架所需的成员对齐方式。

关于c# - 如何将 C 数组映射到 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389950/

相关文章:

javascript - 如何在 C++ 中构建可以使用 Javascript 编写脚本的 ActiveX 对象

c# - Office.Interop.Powerpoint 导入

java - 如何在 Java 中传递嵌套的 Scala 对象引用?

javascript - 将动态 Html 内容写入页面或弹出窗口

C# Math.Cos(double) 返回错误值

c++ - 从另一个字符串、一个 int 和一个字符串文字定义一个字符串

c++ - 如何链接到二进制库的调试版本

c# - 您可以使用多个过滤器调用 Directory.GetFiles() 吗?

c# - 是否可以在 EF 下加载上下文中的所有集合?

c++ - MAC 操作系统上的链接错误