2016-05-22 65 views
-3

我有一個掛鉤或安裝回調的問題。C++鉤子或C#項目的回調

我想運行一個C#項目,但我需要使用匯編程序,所以我創建了一個C++ DLL asm內聯代碼。在那裏我創建了跳轉(Hooks與5x NOP)來鉤住遊戲的一些功能並調用DLL中的函數。

一切都很好,但現在有一個問題:我想在我的C#項目中使用這些鉤子。

所有的一切,我想要的是:

我從我的C#項目啓動DLL。 如果調用C++ dll中的函數(例如onPlayerDrink(std::string kindOfDrink)),則應該調用C#項目中的函數(例如onPlayerDrinkHook(string kindOfDrink)

感謝您的幫助! :)

回答

0

最簡單的方法之一是通過使用C++/CLI,您可以爲您的本機非託管C++代碼創建一個CLR託管包裝。爲此,請在Visual Studio中創建一個新的類庫 C++項目。

在您的C++/CLI代碼中,爲非託管代碼創建一個簡單的包裝,如下所示。讓我們假設你有一些類在C++代碼中調用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; 
}; 

然後你只需添加將此類庫引用到您的C#項目中(請參閱項目設置中添加引用),然後您可以像使用普通C#類一樣使用Managed類。

+0

謝謝!我用你的解決方案在C++ DLL和C#項目之間安裝了'橋'。但是現在我意識到,這不是完整的解決方案:當我的C++ DLL中的extern引擎調用方法時,我需要在C#項目中調用方法...因此,不僅通過這些橋使用C#項目中的函數,我需要以某種方式回調它。你有答案嗎? :) – Alf21

+0

@ Alf21我通常總是有一個C#項目調用本地C++代碼,而不是其他方式,所以我不確定那個,但如果我找到任何東西,那麼我會在這裏更新我的答案。 – ArchbishopOfBanterbury

+0

非常感謝你:)我也搜索了一個解決方案,但在NET中沒有條目:/我想過回調,但那不是我想要的。是否有可能管理一個庫,在調用函數時與彙編程序進行檢查,然後調用C#項目的函數? – Alf21