gpt4 book ai didi

c - 如何调用 C dll 中的函数,这些函数将指针作为 C# 的参数

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:11 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章!

我正在尝试使用 C# 制作一个 Windows 窗体程序,它将使用一个预编译的 C 库。它将访问智能卡并从中提供输出。对于库,我有一个 .dll、.lib 和 .h,但没有源代码。在 .h 文件中定义了几个结构。 .dll 中最有趣的函数期望指向已分配结构的指针作为参数。我一直在 .dll 中这样调用函数:例如函数

EID_API int WINAPI EidStartup(int nApiVersion);

会这样称呼

[DllImport("CelikApi.dll")]//the name of the .dll
public static extern int EidStartup(int nApiVersion);

现在我的问题是我找不到 C# 中指向内存中动态分配结构的 C 指针的等价物,所以我不知道将什么作为参数传递给采用 C 指针的函数。

我在 C# 方面没有太多经验,但对我来说,使用它看起来是制作我需要的程序的最简单方法。我尝试使用 C++,但 Visual Studio 2010 没有用于 C++/CLR 的 IntelliSense。如果你能给我指出更好的东西,请随时这样做。

最佳答案

你可以做类似的事情

    [DllImport("Operations.dll")]
public static extern void Operation(
[MarshalAs(UnmanagedType.LPArray)]ushort[] inData,
int inSize1, int inSize2,
[MarshalAs(UnmanagedType.LPArray)]int[] outCoords,
ref int outCoordsSize);

该代码将采用动态分配的无符号短数组(C# 中的 ushort)以及多个大小参数(inSize1 和 inSize2),并将结果放入大小为 outCoordsSize 的 outCoords 数组中。

您的 C 代码无法分配内存并期望 C# 能够很好地处理它; C# 应该分配你的 C 代码使用的所有内存。在上面的例子中,你可以将outCoords数组的大小放在outCoordsSize中,然后将outCoordsSize的值替换为你实际使用的内存量(不能超过你最初分配的内存量,无一异常(exception))。

关于c - 如何调用 C dll 中的函数,这些函数将指针作为 C# 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com