




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#調(diào)用C++動(dòng)態(tài)庫(kù)接口函數(shù)和回調(diào)函數(shù)方法目錄1.前言2.普通接口函數(shù)調(diào)用示例2.1C++端編寫接口2.2C#端調(diào)用3.回調(diào)函數(shù)調(diào)用示例3.1C++端編寫接口3.2C#端調(diào)用
1.前言
需求:當(dāng)前C已經(jīng)寫好了一個(gè)動(dòng)態(tài)庫(kù),完成了產(chǎn)品開發(fā)需求,C#需要調(diào)用C編寫的動(dòng)態(tài)庫(kù)DLL接口,開發(fā)出完整的軟件,DLL動(dòng)態(tài)庫(kù)里包含了普通接口函數(shù),回調(diào)函數(shù)。
開發(fā)環(huán)境:win1064位、VS2017
2.普通接口函數(shù)調(diào)用示例
2.1C++端編寫接口
(1)頭文件里聲明需要提供的接口,導(dǎo)出接口,方便C#調(diào)用
//帶返回值無(wú)形參示例
EXTERN_CTOOLLIBRARY_APIchar*Version(void);
//無(wú)返回值帶指針形參示例
EXTERN_CTOOLLIBRARY_APIvoidSetApplicationDirPath(char*buff);
(2)源代碼
char*Version(void)
returnversion_str;
voidSetApplicationDirPath(char*buff)
std::stringstr=buff;
printf("傳入的參數(shù):%s\n",buff);
std::cout"字符串:"buffstd::endl;
}
這里寫了兩個(gè)函數(shù),分別演示傳參和帶返回值的接口函數(shù)使用方法。
2.2C#端調(diào)用
namespaceCSharp_LoadLibrary
classProgram
{
[DllImport("TOOLLIBRARY.dll",EntryPoint="Version",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)]
externstaticIntPtrVersion();
[DllImport("TOOLLIBRARY.dll",EntryPoint="SetApplicationDirPath",CallingConvention=CallingConvention.Cdecl)]
externstaticvoidSetApplicationDirPath(IntPtrtext);
staticvoidMain(string[]args)
{
//傳入?yún)?shù)--測(cè)試
SetApplicationDirPath(Marshal.StringToHGlobalAnsi("傳入字符串測(cè)試.."));
//打印返回值測(cè)試
Console.WriteLine(Marshal.PtrToStringAnsi(Version()));
}
}
}
3.回調(diào)函數(shù)調(diào)用示例
回調(diào)函數(shù),光聽名字就比普通函數(shù)要高大上一些,那到底什么是回調(diào)函數(shù)呢?下面來(lái)至百度百科的解釋:
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
回調(diào)函數(shù)是指使用者自己定義一個(gè)函數(shù),實(shí)現(xiàn)這個(gè)函數(shù)的程序內(nèi)容,然后把這個(gè)函數(shù)(入口地址)作為參數(shù)傳入別人(或系統(tǒng))的函數(shù)中,由別人(或系統(tǒng))的函數(shù)在運(yùn)行時(shí)來(lái)調(diào)用的函數(shù)。函數(shù)是你實(shí)現(xiàn)的,但由別人(或系統(tǒng))的函數(shù)在運(yùn)行時(shí)通過(guò)參數(shù)傳遞的方式調(diào)用,這就是所謂的回調(diào)函數(shù)。簡(jiǎn)單來(lái)說(shuō),就是由別人的函數(shù)運(yùn)行期間來(lái)回調(diào)你實(shí)現(xiàn)的函數(shù)。
3.1C++端編寫接口
(1)頭文件聲明
//設(shè)置回調(diào)函數(shù)指針
EXTERN_CTOOLLIBRARY_APIvoidSet_DebugCallBackFunction(void(*func)(constchar*p));
(2)源代碼
//C++的回調(diào)函數(shù)
voidSet_DebugCallBackFunction(void(*func)(constchar*p))
//設(shè)置回調(diào)函數(shù)指針
CallBackFunction_p=func;
printf("回調(diào)函數(shù)設(shè)置成功.\n");
CallBackFunction_p("這是回調(diào)函數(shù)傳出來(lái)的測(cè)試數(shù)據(jù).\n");
}
這是C端編寫的一個(gè)回調(diào)函數(shù)設(shè)置函數(shù),C#調(diào)用這個(gè)函數(shù)將函數(shù)指針傳遞過(guò)來(lái),C通過(guò)傳遞過(guò)來(lái)的函數(shù)指針?lè)催^(guò)來(lái)主動(dòng)調(diào)用C#的方法,實(shí)現(xiàn)數(shù)據(jù)交互。
3.2C#端調(diào)用
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Runtime.InteropServices;
namespaceCSharp_LoadLibrary
classProgram
{
[DllImport("TOOLLIBRARY.dll",EntryPoint="Set_DebugCallBackFunction",CallingConvention=CallingConvention.Cdecl)]
externstaticintSet_DebugCallBackFunction(CallbackDelegatecallback);
//定義委托
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
publicdelegatevoidCallbackDelegate(IntPtrPath);
//接收C++回調(diào)數(shù)據(jù)
//當(dāng)C++調(diào)用傳遞過(guò)去的函數(shù)指針時(shí),就會(huì)執(zhí)行下面這個(gè)方法
staticvoidCallBackFunction(IntPtrPath)
{
Console.WriteLine("C++傳出來(lái)的回調(diào):"+Marshal.PtrToStringAnsi(Path));
}
static
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)五年級(jí)期末試卷(集錦12篇)
- 采石場(chǎng)股份買賣與礦山安全生產(chǎn)責(zé)任書
- 智能家居社區(qū)場(chǎng)地及智能家居租賃合同
- 房屋買賣合同催告與產(chǎn)權(quán)轉(zhuǎn)移合同
- 餐飲連鎖企業(yè)旗下特色餐廳品牌轉(zhuǎn)讓及經(jīng)營(yíng)管理合同
- 車輛質(zhì)押融資與汽車改裝設(shè)計(jì)合同
- 知識(shí)產(chǎn)權(quán)代理授權(quán)委托書范本
- 拆遷補(bǔ)償安置及安置房銷售合同范本
- 2025私人借款合同書模板
- 2025版FIDIC合同主要條款深度解析
- GB/T 9576-2013橡膠和塑料軟管及軟管組合件選擇、貯存、使用和維護(hù)指南
- 營(yíng)維一體化SOP手冊(cè)(裝維、銷售、維系)
- FZ/T 93056-1999變形絲用筒管技術(shù)條件
- 第六章神經(jīng)系統(tǒng)
- 醫(yī)療不良事件報(bào)告表
- SA8000-2014社會(huì)責(zé)任績(jī)效委員會(huì)SPT組織架構(gòu)、職責(zé)和定期檢討及評(píng)審會(huì)議記錄
- 材料加工新技術(shù)與新工藝112課件
- 國(guó)開作業(yè)科研人員TRIZ技術(shù)創(chuàng)新方法應(yīng)用培訓(xùn)-單元測(cè)驗(yàn)1(確定項(xiàng)目+描述項(xiàng)目)76參考(含答案)
- 企業(yè)安全生產(chǎn)網(wǎng)格化管理體系圖空白
- 百日咳臨床研究進(jìn)展PPT醫(yī)學(xué)課件
- 大型鋼網(wǎng)架整體提升施工工法
評(píng)論
0/150
提交評(píng)論