如何获得指向C函数的指针?

时间:2014-07-28 17:27:01

标签: c# .net delegates pinvoke function-pointers

某些C函数(A)将函数指针作为参数。它检查此指针指向某个C函数(B)。所以,我需要将指针B传递给A. 我以为我可以通过以下方式实现这一目标:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();

[DllImport("somelibrary", CallingConvention = CallingConvention.Cdecl)]
private static extern void B();

然后获取函数的地址:

var pointer = Marshal.GetFunctionPointerForDelegate(new MyDelegate(B));

但显然,我得到的指针并没有指向B(因为,通过调用GetFunctionPointerForDelegate,两个不同的代表缠绕在B上,我会得到不同的结果)。 那么,有没有办法获得一个直接指向B的指针?

1 个答案:

答案 0 :(得分:4)

我想要您想要做的是获取非托管功能的地址。 GetFunctionPointerForDelegate做的是返回一个指向托管代码的指针,以便调用非托管代码,这不是您要查找的内容。

如果您需要从模块获取本机函数的地址,您应该使用本机Win32来执行此操作,例如在库上使用GetProcAddress。所以你要做的是使用LoadLibrary(或其中一个变体)来获取模块的句柄,将其传递给GetProcAddress以及您要查找的导出名称,&#34 ; B"在您的示例中,然后使用FreeLibrary将引用计数减少到模块。 GetProcAddress的返回值为您提供了所需的指针。