某些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的指针?
答案 0 :(得分:4)
我想要您想要做的是获取非托管功能的地址。 GetFunctionPointerForDelegate
做的是返回一个指向托管代码的指针,以便调用非托管代码,这不是您要查找的内容。
如果您需要从模块获取本机函数的地址,您应该使用本机Win32来执行此操作,例如在库上使用GetProcAddress
。所以你要做的是使用LoadLibrary
(或其中一个变体)来获取模块的句柄,将其传递给GetProcAddress
以及您要查找的导出名称,&#34 ; B"在您的示例中,然后使用FreeLibrary
将引用计数减少到模块。 GetProcAddress的返回值为您提供了所需的指针。