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

标签 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 */
}

最佳答案

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/

相关文章:

c - C语言从文件中读取字符

c - 如何分配内存并将其返回(通过指针参数)给调用函数?

objective-c - 从 C 函数调用 Objective-C 对象方法

c++ - 我是否错误地传递了这个二维数组?

c# - 在 WPF 中,如何在另一个线程(另一个调度程序)上设置窗口的窗口所有者

c# - 使用 asp.net 的 Entity Framework 示例

c# - 表达式树中的可空比较

c++ - 尝试创建一个程序来查找非二叉树的高度。以一个很长的循环结束,没有答案

c - Pascal 字符串到 cstring

c# - 捕获解决方案资源管理器事件