从c#调用C dll中的函数,返回某种指向函数指针的指针

本文关键字:指针 函数 返回 dll 调用 | 更新日期: 2023-09-27 17:50:31

我有一个用C编写的dll(无法访问源代码),我希望从c#调用。如果dll使用简单类型,我就知道如何通过PInvoke来处理它,但它没有:(

我试图调用的dll中的函数不需要参数,所以问题是如何处理返回。我有一些示例C代码,调用我喜欢在c#中重新创建的函数。正如我所理解的返回类型是一个指向函数指针的指针,这是正确的吗?函数的返回值稍后也应该传递给dll中的其他函数。

任何帮助都是非常感谢的:)

/* C code */
typedef const struct simModel* (*ModelFunc)(void);
int ret=0;
HINSTANCE hInst = 0;
ModelFunc f=0;
const struct simModel*model =0;
if (!(hInst=LoadLibrary("model.dll"))) {
    return 1;
}
if (!(f=(ModelFunc)GetProcAddress(hInst,"simModelFunctions"))) {
    ret=1;
} else if (!(model=f())) {
    ret=1;
} else {
    /* Do stuff */
}

从c#调用C dll中的函数,返回某种指向函数指针的指针

simModelFunctions函数返回指向simModel结构体(数据类型)的指针。

您所展示的代码通过动态查找其地址来调用函数,这就是为什么它有一个函数指针。这个指针不是来自函数本身。

在c#中,你可以简单地使用model.dll中的DllImport来声明它。例如
[DllImport("model.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
private static IntPtr simModelFunctions();

如果您需要检查结构的内容,则可以使用Marshal.PtrToStructure,或者直接将返回的IntPtr传递给其他函数,而不关心内部的内容