c#调用c++带有回调函数方法的实现
2012-11-06 16:41
423 查看
在c++中有个回调函数指针的概念,只需要某个函数在调用定时器函数时传入一个函数指针就能达到目的,但C#中没有函数指针的概念,我们该怎样来实现呢。
其实说到回调函数,大家应该能想到c#中的委托,虽然名字不一样,但在各自的语言范畴都能实现相似的功能。所以我们就可以大胆的尝试下,把c#中的委托传给c++,看c++是否能够承认它就是回调函数。
首先用c++写一个带有回调函数的方法 Test,在此省略。
接着,在c#中调用,如:
接下来我们再定义一个委托:
注:说明一下,在给c++传入数组参数时,必须得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 处理一下,相当于是告诉c++,c#传入的是一个长度为8010的数组类型,如果不写这句话的话,你回调函数接收到的参数将只有一条数据。
接下来看看怎样来调用:
在调用时,我们得先写一个接受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++要的回调函数。
相关文章推荐
- c#调用c++带有回调函数方法的实现
- c# 调用c++带有回调函数方法的实现
- c# 调用c++带有回调函数方法的实现
- C++实现调用C#(CLI)方法
- C# 调用C++写的dll的实现方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 利用c#实现dll动态库,并在c++中调用的方法
- 如何实现C++调用C#的dll方法教程
- C++调用C#的DLL程序实现方法
- C++调用C#的DLL实现方法
- C++调用C#的DLL实现方法
- C++调用C#的DLL实现方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 转:使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- c# 动态加载dll文件,并实现调用其中的简单方法
- C# 调用C++DLL传递指向指针的指针参数的方法
- 不用AJAX实现前台JS调用后台C#方法(小技巧)-转
- c# 如何调用非托管函数3-实现回调函数
- 浅谈C++调用C#的DLL程序方法