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

标签 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 并用两个不同的委托(delegate)包裹 B,我得到了不同的结果)。 那么,有没有办法得到一个直接指向 B 的指针呢?

最佳答案

认为您正在尝试做的是获取非托管函数的地址。 GetFunctionPointerForDelegate 所做的是返回一个指向托管地址的指针,供非托管代码调用,这不是您要查找的内容。

如果您需要从模块中获取 native 函数的地址,您应该使用 native Win32 来执行此操作,例如在您的库中使用 GetProcAddress。所以你会做的是使用 LoadLibrary (或其变体之一)获取模块句柄,将其传递给 GetProcAddress连同您要查找的导出的名称,在您的示例中为“B”,然后使用 FreeLibrary减少对模块的引用计数。 GetProcAddress 的返回值为您提供了您正在寻找的指针。

关于c# - 如何获得指向 C 函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000784/

相关文章:

c# - Okta SDK 过滤具有活跃状态并使用 StartsWith 和 Contains 关键字的用户

c# - 仅在需要时加载类的 byte[] 属性

c# - 仅向管理员授予对特殊表单的访问权限

.net - 如何在 Windows 事件系统中创建日志名层次结构?

iphone - 使用 UINavigationController 和默认后退按钮时如何将数据传回父 View ?

c# - Action<T> 中的三元运算符不起作用

javascript - 在鼠标悬停时显示/隐藏 div 不起作用

c# - OnMouseMove 不会在 WPF 中的 Canvas 上触发

.net - ClickOnce 部署未按预期安装

c# - 演示受限执行区域重要性的代码