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
我在连接或安装回调时遇到问题。
我想 运行 一个 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.
在您的 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