c# - 如何在托管函数中 Hook 非托管函数?

标签 c# c++ .net vb.net

这是我的 C++ 代码:
此函数在我的 DLL 中导出。

EXPORT set_hook(fnc_public_hook hook){
    public_hook = hook;
}

现在,如果我从非托管代码中 Hook 它,就像遵循一切正常一样。

set_hook(my_fnc);

现在,在调用我的 DLL my_fnc 中的每个事件之前,我可以对数据进行一些预处理。

问题是我不知道如何在 .NET 中执行此操作。
如何获取 .NET 函数指针?以及如何在每个事件之前使用 set_hook() 调用我的 .NET 函数?

最佳答案

using System.Runtime.InteropServices;   

在某处,为您想要调用的函数创建一个委托(delegate)

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate uint YourFunctionDelegate();

将您的委托(delegate)设置为指向您的函数,即在您的构造函数中,

YourFunctionDelegate = myDotNetFunc;

在您的命名空间内的 NativeMethods 类中,

[DllImport("YourDLL.dll", EntryPoint = "set_hook", CallingConvention = CallingConvention.Cdecl)]
    private static extern int setHook([MarshalAs(UnmanagedType.FunctionPtr)]YourFunctionDelegate myDelegate);

最后,你可以调用你的c++函数

NativeMethods.setHook(YourFunctionDelegate);

确保您知道哪种调用约定是合适的。

编辑:不要收集垃圾!

http://msdn.microsoft.com/en-us/library/ms182294%28v=vs.80%29.aspx

Preventing unmanaged function pointer garbage collection

关于c# - 如何在托管函数中 Hook 非托管函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20705696/

相关文章:

c++ - 当 what() != T 时,如何使 boost::variant 返回 T(),或者如何检查 T==what()?

c# - 使用统一框架在 MVC 3 中进行依赖注入(inject)

.Net 应用程序在配置更改时自动重启

c# - WPF 数据绑定(bind) : enable/disable a control based on content of var?

c# - 本地主机永远等待 ASP.NET 5 应用程序模板项目

javascript - 以编程方式单击 Windows UWP WebView 中的 anchor

c# - 字典、列表还是数组?

c# - 在方法中将自定义类属性作为 lambda 传递

c++ - 使用 sync_with_stdio 时打印顺序

c++ - 将模板方法移动到派生中断编译