gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:11 24 4
gpt4 key购买 nike

这是我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com