讲解如何实现C#回调函数

如题所述

什么是C#回调函数? C#回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。 理解C#回调函数! 程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下: call(调用)program--------------------→dll程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的DLL函数往往是一些必须重复执行某些操作的函数.关系表示如下: call(调用)callback(回调) 当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用! 也有这样的说法(比较容易理解): 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事: 1.声明; 2.定义; 3.设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。 下面是示例代码:WorkClass.cs: usingSystem; namespaceCallBackSample ...{ publicdelegatestringShowMessage(stringmessage); internalclassWorkClass ...{ publicvoidDoWork(stringmessage) ...{ ShowMessageshowMessage=newShowMessage(showCoolMessage); showMessage+=showTerribleMessage; stringresult=""; foreach(ShowMessageshinshowMessage.GetInvocationList()) ...{ result+=sh(message); } Console.Write(result); Console.Read(); } privatestringshowCoolMessage(stringmessage) ...{ strings=message+"Cool!"; returns; } privatestringshowTerribleMessage(stringmessage) ...{ strings=message+"Terrible!"; returns; } } } program.cs: namespaceCallBackSample ...{ classProgram ...{ staticvoidMain(string[]args) ...{ WorkClassworkClass=newWorkClass(); workClass.DoWork("Basketball"); } } }
温馨提示:内容为网友见解,仅供参考
无其他回答

如何在C#写的dll 里调用回调函数?
3.如果你的C++是基于winform的,可以在C#中P\/Invoke调用winAPI的SendMessage发送窗体消息从而间接实现回调。4.自然还有一些更底层的Dirty方法,比如嵌汇编更改上下文程序指针地址。。。不过不适合正统的程序,因为太Dirty啊。。。而且出错概率大。除此之外,如果不采用多线程通信,C#的反射(reflection)特性可...

c#-回调callback是什么原理,机制? C#
当被调函数所执行处理完毕时,被调函数反过来调用一个指定的函数(称为回调函数)向调用者返回处理结果或通知调用者处理结束。这个过程称为回调(Callback)。通常,调用者发出调用时,以函数参数方式将回调函数传递给被调函数。在C#中,回调过程与其他语言没有区别,只是回调函数是以委托方式传递的。

请教C#回调函数的调用问题
当然,在C\/CPP中我们存在指针,把函数(或成员方法,面向过程语言或支持面向过程语言中存在函数或过程的概念)指针做为参数传递即可——这是一种典型的“传址”引用的方式,在C#没有指针的情况下想完成一个传址引用,ref\/out只能传递参数变量,并不能将方法转换成地址传入另一个方法的参数(方法参数化)...

c#调用sdk时,求教回调函数如何处理
回调函数用.NET中的委托处理 比如SDK中有个查找所有窗口的函数:[DllImport("user32")]private static extern bool EnumWindows(DelegateEnumWindow ew, int lParam);上面的参数ew就是一个委托(回调函数),再看这个参数的声明:delegate bool DelegateEnumWindow(IntPtr hWnd, int lParam);再看调用:DelegateEn...

谁帮我写个C# delegate回调函数的例子,谢谢了
首先创建一个很简单的委托~public delegate void DoIt(string str);然后创建一个委托引用~public DoIt _DoIt;之后就是在你程序需要触发回调函数的地方去执行这个委托~if (_DoIt != null) \/\/执行委托需要判断是否为空,如果没有将对应签名的方法存入委托,直接执行会报错 { _DoIt("测试");} 最后就...

c# 异步怎么回调
n.ToString();\/\/ 参数n就是异步回调返回的结果,} 异步回调需要编写代码才能支持,网络传输方面的类库一般都提供异步方法,如socket编程,web服务,ajax,wcf等,有些异步是同一个线程完成的,有些异步是不同的线程,所以回调函数里要更新控件都会提示跨线程访问控件的错误提示。该文章转自:站点基地 ...

c#异步通信中回调函数AsyncCallback如何传递参数
}\/\/ 2)在异步调用前,实例化StateObjectStateObject state = new StateObject();state.frd = frd;state.combo = comBox_client;AsyncCallback callBack = new AsyncCallback(sendCallBack);frd.socket.BeginSend(msg, 0, msg.Length, SocketFlags.None, callBack, state);\/\/3)在回调函数中使用...

求助:如何封装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);接下来我们再...

c#调用sdk时,求教回调函数如何处理
System.Runtime.InteropSerivces.Marshal类中有相关方法,能返回委托相对应的指针:IntPtr GetFunctionPointerForDelegate<T>(T targetDelegate);通过这个函数就能获取委托相对应的指针,再把指针传递给 SDK 函数即可。

C#中回调 Callback
代理下载,回调应用实例 using System;using System.IO;using System.Net;using System.Net.Sockets;private void Loader1(){ HttpWebRequest hrqt=(HttpWebRequest)WebRequest.Create("http:\/\/msdn2.microsoft.com\/zh-cn\/default.aspx");hrqt.Proxy=(IWebProxy)new WebProxy(proxyip_string,port_...

相似回答