2

我在 DLL 中有这样的代码:

int (*callback)(int a, int b);
void mainfunc()
{
    callback(1, 2);
    callback(3, 4);
}

为了从 C 程序访问这个 DLL,我曾经这样做:

#include <windows.h>

int callback(int a, int b) {return a+b;}

int main()
{
    HANDLE dll = LoadLibrary("test.dll");
    *(void**)GetProcAddress(dll, "callback") = (void*)callback;
    ((void(*))GetProcAddress(dll, "mainfunc"))();
    FreeLibrary(dll);
}

DLL 仍然是 C 代码,但主程序已切换到 C#。如何处理函数指针?该代码在 C# 中的表现如何?

4

1 回答 1

3

callback是 dll 中的全局变量,因此您不能 [1] 从 c# 中设置它。

您也不应该从 C 中设置它。如果真的共享回调,您应该拥有的是一个像SetCallback( MyCallbackType callback )设置它的函数。

但很可能,您想将该函数传递给 mainfunc。

无论哪种情况,这在 C# 中都很容易做到:

// C#
public delegate Int32 Callback( Int32 a, Int32 b );
[DllImport("test.dll")]
static extern void mainfunc( Callback callback );
// Or if you're setting the callback globally, 
[DllImport("test.dll")]
static extern void SetCallback(Callback callback);
[DllImport("test.dll")]
static extern void mainfunc();

带回家的信息是 DllImport 足够聪明,可以将具有相当接近签名的委托转换为 C 函数指针。

[1] 好的,所以你可以...dll 注入有时会使用这些方法中的许多技巧之一,但在任何其他情况下都是错误的方法。

于 2012-09-07T14:55:43.883 回答