XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog
随笔 - 879,  文章 - 0,  评论 - 1190,  阅读 - 34万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

回调示例

 

在本文中

  1. 声明原型
  2. 调用函数

此示例演示如何将委托传递给需要函数指针的非托管函数。委托是一个可以保存方法引用的类,相当于类型安全的函数指针或回调函数。Microsoft .NET Framework SDK 包含此示例的完整 Visual Basic .NET 和 C# 版本,位于 Samples\Technologies\Interop\Platform-Invoke 中。

注意   当您在调用中使用委托时,公共语言运行时会保护委托在该调用期间不被垃圾回收。但是,如果非托管函数存储委托以在调用完成后使用,则必须手动阻止垃圾回收,直到非托管函数完成委托。有关更多信息,请参阅HandleRef 示例GCHandle 示例

回调示例使用以下非托管函数,并显示其原始函数声明:

  • 从 PinvokeLib.dll 导出的TestCallBack

    void TestCallBack(FPTR pf, int value);
    
  • 从 PinvokeLib.dll 导出的TestCallBack2

    void TestCallBack2(FPTR2 pf2, char* value);
    

PinvokeLib.dll是一个自定义非托管库,其中包含前面列出的函数的实现。

在此示例中,该类包含和方法LibWrap的托管原型这两种方法都将委托作为参数传递给回调函数。委托的签名必须与其引用的方法的签名相匹配。例如,和委托具有与和方法相同的签名TestCallBackTestCallBack2FPtrFPtr2DoSomethingDoSomething2

声明原型

VB
Public Delegate Function FPtr( ByVal value As Integer ) As Boolean
Public Delegate Function FPtr2( ByVal value As String ) As Boolean

Public 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 );   
}

调用函数

VB
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 'DoSomething2
End 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 );
      ...
   }   
}

也可以看看

杂项编组样本平台调用数据类型在托管代码中创建原型

 
posted on   不及格的程序员-八神  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2019-08-28 SOAP MIME Attachment
2019-08-28 Calling WCF Services using jQuery
点击右上角即可分享
微信分享提示