c# 調用c++帶有回調函數方法的實現


目前正在做的一個項目,大部分數據來源都是通過調用c++函數得到的,此時就遇到一個這次要說的問題。

如c++函數有個定時器,會定時調用我們c#的某個函數並把數據傳給c#,讓c#把數據顯示到界面上,在c++中有個回調函數指針的概念,只需要某個

函數在調用定時器函數時傳入一個函數指針就能達到目的,但C#中沒有函數指針的概念,我們該怎樣來實現呢。

其實說到回調函數,大家應該能想到c#中的委托,雖然名字不一樣,但在各自的語言范疇都能實現相似的功能。所以我們就可以大膽的嘗試下,把c#中的委托傳給

c++,看c++是否能夠承認它就是回調函數。

首先用c++寫一個帶有回調函數的方法 Test,在此省略。

接着,在c#中調用,

如:

[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)] 

private static extern void Test(string fileName,CallbackDelegate callback);

接下來我們再定義一個委托: 

public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count); 

public static CallbackDelegate callback;

注:說明一下,在給c++傳入數組參數時,必須得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 處理一下,相當於是告訴c++,c#傳入的是一個長度為8010的數組類型,如果不寫這句話的話,你回調函數接收到的參數將只有一條數據。 

接下來看看怎樣來調用:

在調用時,我們得先寫一個接受c++傳回參數的方法,即我們傳入委托的實現方法。

private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count) 

{

...//處理c++傳過來的數據s

}

一切工作准備完畢之后,我們來進行最后一步操作把

public void GetData()

{

callback=CallBackFunction;

ReadMyVideo("",callback);

}

經過驗證,委托就是c++要的回調函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM