亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#調(diào)用C++動(dòng)態(tài)庫(kù)接口函數(shù)和回調(diào)函數(shù)方法

 更新時(shí)間:2022年03月21日 17:00:12   作者:DS小龍哥  
這篇文章主要介紹了C#調(diào)用C++動(dòng)態(tài)庫(kù)接口函數(shù)和回調(diào)函數(shù)方法,通過(guò)C++端編寫接口展開內(nèi)容,文章介紹詳細(xì)具有一定的參考價(jià)值,需要的小伙伴可以參考一下

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)境: win10 64位 、VS2017

2. 普通接口函數(shù)調(diào)用示例

2.1 C++端編寫接口

(1)頭文件里聲明需要提供的接口,導(dǎo)出接口,方便C#調(diào)用

//帶返回值無(wú)形參示例
EXTERN_C TOOLLIBRARY_API char* Version(void);
//無(wú)返回值帶指針形參示例
EXTERN_C TOOLLIBRARY_API void SetApplicationDirPath(char *buff);

(2)源代碼

char* Version(void)
{
?? ?return version_str;
}

void SetApplicationDirPath(char * buff)
{
?? ?std::string str = buff;
?? ?printf("傳入的參數(shù):%s\n", buff);
?? ?std::cout << "字符串:"<<buff <<std::endl;
}

這里寫了兩個(gè)函數(shù),分別演示傳參和帶返回值的接口函數(shù)使用方法。

2.2 C#端調(diào)用

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)
? ? ? ? {
? ? ? ? ? ? //傳入?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.1 C++端編寫接口

(1)頭文件聲明

//設(shè)置回調(diào)函數(shù)指針
EXTERN_C TOOLLIBRARY_API void Set_DebugCallBackFunction(void(*func)(const char *p));

(2)源代碼

//C++的回調(diào)函數(shù)
void Set_DebugCallBackFunction(void(*func)(const char *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.2 C#端調(diào)用

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++回調(diào)數(shù)據(jù)
? ? ? ? //當(dāng)C++調(diào)用傳遞過(guò)去的函數(shù)指針時(shí),就會(huì)執(zhí)行下面這個(gè)方法
? ? ? ? static void CallBackFunction(IntPtr Path)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("C++傳出來(lái)的回調(diào):" + Marshal.PtrToStringAnsi(Path));
? ? ? ? }

? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //調(diào)用C++設(shè)置回調(diào)函數(shù)的接口,將C#的函數(shù)地址傳遞過(guò)去
? ? ? ? ? ? Set_DebugCallBackFunction(CallBackFunction);
? ? ? ? }
? ? }
}

到此這篇關(guān)于C#調(diào)用C++動(dòng)態(tài)庫(kù)接口函數(shù)和回調(diào)函數(shù)方法的文章就介紹到這了,更多相關(guān)C#調(diào)用C++接口函數(shù)和回調(diào)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# 日歷控件的實(shí)現(xiàn)

    c# 日歷控件的實(shí)現(xiàn)

    這篇文章主要介紹了c# 實(shí)現(xiàn)日歷的示例代碼,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • 基于Json序列化和反序列化通用的封裝完整代碼

    基于Json序列化和反序列化通用的封裝完整代碼

    JSON 是存儲(chǔ)和交換文本信息的語(yǔ)法。類似 XML。JSON 比 XML 更小、更快,更易解析。下面通過(guò)實(shí)例代碼給大家分享Json序列化和反序列化通用的封裝,需要的的朋友參考下吧
    2017-07-07
  • c#簡(jiǎn)單讀取文本的實(shí)例方法

    c#簡(jiǎn)單讀取文本的實(shí)例方法

    c#簡(jiǎn)單讀取文本的實(shí)例方法,需要的朋友可以參考一下
    2013-04-04
  • HttpHelper類的調(diào)用方法詳解

    HttpHelper類的調(diào)用方法詳解

    這篇文章主要為大家詳細(xì)介紹了HttpHelper類的使用方法,HttpHelper類及調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C# 使用GDI繪制雷達(dá)圖的實(shí)例

    C# 使用GDI繪制雷達(dá)圖的實(shí)例

    這篇文章主要介紹了C# 使用GDI繪制雷達(dá)圖,本文通過(guò)一段實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享

    C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享

    主流的識(shí)別庫(kù)主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR碼檢測(cè)和解碼功能,所以本文主要和大家分享了使用ZBar進(jìn)行條形碼識(shí)別的示例代碼,需要的可以參考一下
    2023-07-07
  • C#使用泛型方法設(shè)計(jì)實(shí)現(xiàn)單向鏈表詳解

    C#使用泛型方法設(shè)計(jì)實(shí)現(xiàn)單向鏈表詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何使用泛型方法設(shè)計(jì)實(shí)現(xiàn)一個(gè)單向鏈表,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解

    Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Unity3D使用Shader實(shí)現(xiàn)腐蝕消失

    Unity3D使用Shader實(shí)現(xiàn)腐蝕消失

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用Shader實(shí)現(xiàn)腐蝕消失,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C# WPF編程之命令模型詳解

    C# WPF編程之命令模型詳解

    這篇文章主要為大家詳細(xì)介紹了C# WPF編程中命令模型的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評(píng)論