C# 项目的 C++ 钩子或回调

C++ hook or callback for C# project

我在连接或安装回调时遇到问题。

我想 运行 一个 C# 项目,但我需要使用汇编器,所以我用 asm 内联代码创建了一个 C++ DLL。我在那里创建了跳转(具有 5x NOP 的钩子)来钩住游戏的一些函数并调用 DLL 中的函数。

一切顺利,但现在有一个问题:我想在我的 C# 项目中使用这些挂钩。

总而言之,我想要的是:

我从我的 C# 项目启动 dll。 如果调用 C++ dll 中的函数(例如 onPlayerDrink(std::string kindOfDrink) ),则应调用 C# 项目中的函数(例如 onPlayerDrinkHook(string kindOfDrink)

感谢您的帮助! :)

执行此操作的最简单方法之一是使用 C++/CLI,从而为您的本机非托管 C++ 代码创建一个 CLR 托管包装器。为此,在 Visual Studio.

中创建一个新的 Class Library c++ 项目

在您的 C++/CLI 代码中,为您的非托管代码创建一个简单的包装器,如下所示。假设您的 C++ 代码中有一些 class,名为 Native,结构如下:

class Native {
public:
    Native();
    ~Native();

    int get_x() const noexcept;
    std::string get_y() const noexcept;
private:
    int x;
    std::string y;
};

现在在 C++/CLI 包装器中,您可以拥有以下内容:

public ref class Managed {
public:
    Managed() : native_ptr(new Native()) {}
    ~Managed() { delete native_ptr; }

    int GetX() {
        return native_ptr->get_x();
    }

    System::String^ GetY() {
        return gcnew String(native_ptr->get_y().c_str());
    }
private:
    Native* native_ptr;
}; 

然后您只需将对此 class 库的引用添加到您的 C# 项目中(转到 项目设置 [=26] 中的 添加引用 =]),然后您可以像使用普通 C# class.

一样使用 Managed class