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

时间:2014-03-17 09:29:09

标签: c# c pointers dll

我有一个用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 */
}

1 个答案:

答案 0 :(得分:3)

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

您显示的代码通过动态查找其地址来调用该函数,这就是它具有函数指针的原因。该指针不是来自函数本身。

在C#中,您只需使用model.dll中的DllImport声明它即可。 E.g。

[DllImport("model.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
private static IntPtr simModelFunctions();

然后,如果您需要检查结构的内容,可以使用Marshal.PtrToStructure,或者只是将返回的IntPtr传递给其他函数而不会打扰其中的内容。