某些 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
并用两个不同的委托(delegate)包裹 B,我得到了不同的结果)。
那么,有没有办法得到一个直接指向 B 的指针呢?
最佳答案
我认为您正在尝试做的是获取非托管函数的地址。 GetFunctionPointerForDelegate
所做的是返回一个指向托管地址的指针,供非托管代码调用,这不是您要查找的内容。
如果您需要从模块中获取 native 函数的地址,您应该使用 native Win32 来执行此操作,例如在您的库中使用 GetProcAddress
。所以你会做的是使用 LoadLibrary
(或其变体之一)获取模块句柄,将其传递给 GetProcAddress
连同您要查找的导出的名称,在您的示例中为“B”,然后使用 FreeLibrary
减少对模块的引用计数。 GetProcAddress 的返回值为您提供了您正在寻找的指针。
关于c# - 如何获得指向 C 函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000784/