這篇文章主要介紹了C#調用C++動態庫接口函數和回調函數方法,通過C++端編寫接口展開內容,文章介紹詳細具有一定的參考價值,需要的小夥伴可以參考一下
需求: 當前C已經寫好了一個動態庫,完成了產品開發需求,C#需要調用C編寫的動態庫DLL接口,開發出完整的軟件,DLL動態庫裏包含了普通接口函數,回調函數。
開發環境: win10 64位 、VS2017
2. 普通接口函數調用示例
2.1 C++端編寫接口
(1)頭文件裏聲明需要提供的接口,導出接口,方便C#調用
//帶返回值無形參示例 EXTERN_C TOOLLIBRARY_API char* Version(void); //無返回值帶指針形參示例 EXTERN_C TOOLLIBRARY_API void SetApplicationDirPath(char *buff);
(2)源代碼
char* Version(void) { return version_str; } void SetApplicationDirPath(char * buff) { std::string str = buff; printf("傳入的參數:%s\n", buff); std::cout << "字符串:"<<buff <<std::endl; }
這裏寫了兩個函數,分別演示傳參和帶返回值的接口函數使用方法。
2.2 C#端調用
namespace CSharp_LoadLibrary { class Program { [DllImport("TOOLLIBRARY.dll", EntryPoint = "Version", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] extern static IntPtr Version(); [DllImport("TOOLLIBRARY.dll", EntryPoint = "SetApplicationDirPath", CallingConvention = CallingConvention.Cdecl)] extern static void SetApplicationDirPath(IntPtr text); static void Main(string[] args) { //傳入參數--測試 SetApplicationDirPath(Marshal.StringToHGlobalAnsi("傳入字符串測試..")); //打印返回值測試 Console.WriteLine(Marshal.PtrToStringAnsi(Version())); } } }
3. 回調函數調用示例
回調函數,光聽名字就比普通函數要高大上一些,那到底什麼是回調函數呢?下面來至百度百科的解釋:
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
回調函數是指 使用者自己定義一個函數,實現這個函數的程序內容,然後把這個函數(入口地址)作爲參數傳入別人(或系統)的函數中,由別人(或系統)的函數在運行時來調用的函數。函數是你實現的,但由別人(或系統)的函數在運行時通過參數傳遞的方式調用,這就是所謂的回調函數。簡單來說,就是由別人的函數運行期間來回調你實現的函數。
3.1 C++端編寫接口
(1)頭文件聲明
//設置回調函數指針
//設置回調函數指針 EXTERN_C TOOLLIBRARY_API void Set_DebugCallBackFunction(void(*func)(const char *p));
(2)源代碼
//C++的回調函數 void Set_DebugCallBackFunction(void(*func)(const char *p)) { //設置回調函數指針 CallBackFunction_p = func; printf("回調函數設置成功.\n"); CallBackFunction_p("這是回調函數傳出來的測試數據.\n"); }
這是C端編寫的一個回調函數設置函數,C#調用這個函數將函數指針傳遞過來,C通過傳遞過來的函數指針反過來主動調用C#的方法,實現數據交互。
3.2 C#端調用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace CSharp_LoadLibrary { class Program { [DllImport("TOOLLIBRARY.dll", EntryPoint = "Set_DebugCallBackFunction", CallingConvention = CallingConvention.Cdecl)] extern static int Set_DebugCallBackFunction(CallbackDelegate callback); //定義委託 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void CallbackDelegate(IntPtr Path); //接收C++回調數據 //當C++調用傳遞過去的函數指針時,就會執行下面這個方法 static void CallBackFunction(IntPtr Path) { Console.WriteLine("C++傳出來的回調:" + Marshal.PtrToStringAnsi(Path)); } static void Main(string[] args) { //調用C++設置回調函數的接口,將C#的函數地址傳遞過去 Set_DebugCallBackFunction(CallBackFunction); } } }
到此這篇關於C#調用C++動態庫接口函數和回調函數方法的文章就介紹到這了,更多相關C#調用C++接口函數和回調函數內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支持腳本之家!