如何在托管函数中挂接非托管函数

How To hook unmanaged function inside managed function?

本文关键字:函数      更新时间:2023-10-16

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

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

现在,如果我从非托管代码中钩住它,例如遵循一切就可以正常工作。

set_hook(my_fnc);

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

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

using System.Runtime.InteropServices;   

在某处,为你想要调用的函数创建一个委托

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

将委托设置为指向函数,即在构造函数中,

YourFunctionDelegate = myDotNetFunc;

在命名空间内的 NativeMethods 类中,

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

最后,你可以用

NativeMethods.setHook(YourFunctionDelegate);

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

编辑:不要被垃圾收集!

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

防止非托管函数指针垃圾回收