如何在托管函数中挂钩非托管函数?

时间:2013-12-20 14:23:18

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

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

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

现在,如果我将其与非托管代码挂钩,就像以下一切正常。

set_hook(my_fnc);

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

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

1 个答案:

答案 0 :(得分:0)

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);

最后,您可以使用

调用c ++函数
NativeMethods.setHook(YourFunctionDelegate);

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

编辑:不要收集垃圾!

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

Preventing unmanaged function pointer garbage collection