我有一个用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 */
}
答案 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
传递给其他函数而不会打扰其中的内容。