Callback 示例
来源:互联网 发布:android 网易新闻源码 编辑:程序博客网 时间:2024/05/21 08:59
该示例说明如何将委托传递给需要函数指针的非托管函数。委托是可以容纳对方法的引用的类,并且等效于类型安全函数指针或回调函数。
说明: |
---|
当您在调用内部使用委托时,公共语言运行库将在该调用的持续时间内防止对委托执行垃圾回收。但是,如果非托管函数存储该委托以供在该调用完成后使用,则您必须手动防止进行垃圾回收,直到非托管函数完成对该委托的使用为止。有关更多信息,请参见 HandleRef 示例和 GCHandle 示例。 |
Callback 示例使用以下非托管函数(这里同时显示其原始函数声明):
从 PinvokeLib.dll 导出的 TestCallBack。
void TestCallBack(FPTR pf, int value);
从 PinvokeLib.dll 导出的 TestCallBack2。
void TestCallBack2(FPTR2 pf2, char* value);
PinvokeLib.dll 是一个自定义非托管库,它包含前面列出的函数的实现。
在该示例中,LibWrap 类包含 TestCallBack 和 TestCallBack2 方法的托管原型。这两个方法都将委托作为参数传递给回调函数。该委托的签名必须与它所引用的方法的签名相匹配。例如,FPtr 和 FPtr2 委托的签名与 DoSomething 和 DoSomething2 方法的签名相同。
下面的代码示例的源代码由 .NET Framework 平台调用技术示例 提供。
声明原型
Visual Basic
Public Delegate Function FPtr( ByVal value As Integer ) As BooleanPublic Delegate Function FPtr2( ByVal value As String ) As BooleanPublic Class LibWrap ' Declares managed prototypes for unmanaged functions. Declare Sub TestCallBack Lib "../LIB/PinvokeLib.dll" ( ByVal cb _ As FPtr, ByVal value As Integer ) Declare Sub TestCallBack2 Lib "../LIB/PinvokeLib.dll" ( ByVal cb2 _ As FPtr2, ByVal value As String )End Class 'LibWrap
C#
public delegate bool FPtr( int value );public delegate bool FPtr2( String value );public class LibWrap{// Declares managed prototypes for unmanaged functions. [ DllImport( "..//LIB//PinvokeLib.dll" )] public static extern void TestCallBack( FPtr cb, int value ); [ DllImport( "..//LIB//PinvokeLib.dll" )] public static extern void TestCallBack2( FPtr2 cb2, String value ); }
调用函数
Visual Basic
Public Class App Public Shared Sub Main() Dim cb As FPtr cb = AddressOf App.DoSomething Dim cb2 As FPtr2 cb2 = AddressOf App.DoSomething2 LibWrap.TestCallBack( cb, 99 ) LibWrap.TestCallBack2( cb2, "abc" ) End Sub 'Main Public Shared Function DoSomething( ByVal value As Integer ) As Boolean Console.WriteLine( ControlChars.CrLf + "Callback called with _ param: {0}", value ) … End Function 'DoSomething Public Shared Function DoSomething2( ByVal value As String ) As Boolean Console.WriteLine( ControlChars.CrLf + "Callback called with _ param: {0}", value ) … End Function 'DoSomething2End Class 'App
C#
public class App{ public static void Main() { FPtr cb = new FPtr( App.DoSomething ); LibWrap.TestCallBack( cb, 99 ); FPtr2 cb2 = new FPtr2( App.DoSomething2 ); LibWrap.TestCallBack2( cb2, "abc" ); } public static bool DoSomething( int value ) { Console.WriteLine( "/nCallback called with param: {0}", value ); … } public static bool DoSomething2( String value ) { Console.WriteLine( "/nCallback called with param: {0}", value ); … } }
- Callback 示例
- NodeJS callback示例
- callback的一些变化使用示例
- 【callback】js回调函数示例
- CALLBACK
- callback
- Callback
- CALLBACK
- Callback
- CALLBACK
- CALLBACK
- callBack
- callback
- callback
- callback
- 回调函数 Callback function 的概念与程序示例
- callback&&callback()
- ASP.NET 2.0 正式版中callback的一些变化+使用示例
- Web挖掘技术
- 各个网络端口的入侵方法
- WebSphere5.1下发布XFire的问题解决
- GridView编辑状态時取值,RowUpdating在更新前取編輯框的值進行判斷
- 模态窗口使用总结
- Callback 示例
- 让回调函数 showResponse 也带上参数
- 服务器开发 - 使用magicware开发业务服务
- 关于生成树协议
- 线程--使用线程回调方法(示例下载)
- aagagag
- C#用国王与大臣的故事来理解委托(引申编)
- PE教程5: Section Table(节表)
- 如何提取汉字