我有一个用 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 */
}
最佳答案
simModelFunctions
函数返回指向 simModel
结构(一种数据类型)的指针。
您显示的代码通过动态查找其地址来调用该函数,这就是它具有函数指针的原因。该指针并非来自函数本身。
在 C# 中,您可以简单地使用 model.dll 中的 DllImport 声明它。例如
[DllImport("model.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
private static IntPtr simModelFunctions();
然后你可以使用Marshal.PtrToStructure
如果您需要检查结构的内容,或者只是将返回的 IntPtr
传递给其他函数而不关心里面的内容。
关于c# - 从 C# 调用 C dll 中的函数,它返回某种指向函数指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22450679/