C# 从非托管代码回调的委托用法

C# 从非托管代码回调的委托用法,c#,delegates,unmanaged,C#,Delegates,Unmanaged,这是一本C#书上的。我不明白的是,如果这是一个回调,那么对PrintWindow的EnumWindow调用不应该从user32.dll进行。也许,我没有正确理解委托或回调。请帮助我理解 来自非托管代码的回调 p/Invoke层尽其所能在边界两侧呈现一个自然的编程模型,在可能的情况下映射相关的构造。由于C#不仅可以调用C函数,还可以从C函数(通过函数指针)回调,因此P/Invoke层将非托管函数指针映射到C#中最接近的等效函数,即委托 例如,您可以在User32.dll中使用此方法枚举所有顶级窗口

这是一本C#书上的。我不明白的是,如果这是一个回调,那么对PrintWindow的EnumWindow调用不应该从user32.dll进行。也许,我没有正确理解委托或回调。请帮助我理解

来自非托管代码的回调

p/Invoke层尽其所能在边界两侧呈现一个自然的编程模型,在可能的情况下映射相关的构造。由于C#不仅可以调用C函数,还可以从C函数(通过函数指针)回调,因此P/Invoke层将非托管函数指针映射到C#中最接近的等效函数,即委托

例如,您可以在User32.dll中使用此方法枚举所有顶级窗口句柄:

      BOOL EnumWindows (WNDENUMPROC lpEnumFunc, LPARAM lParam);

     WNDENUMPROC is a callback that gets fired with the handle of each window in sequence (or until the callback returns false). Here is its definition:
BOOL回调EnumWindowsProc(HWND-HWND,LPARAM-LPARAM)

要使用此方法,我们声明一个具有匹配签名的委托,然后将委托实例传递给外部方法:

  using System;
 using System.Runtime.InteropServices;

 class CallbackFun
{
    delegate bool EnumWindowsCallback (IntPtr hWnd, IntPtr lParam);

   [DllImport("user32.dll")]
   static extern int EnumWindows (EnumWindowsCallback hWnd, IntPtr lParam);

   static bool PrintWindow (IntPtr hWnd, IntPtr lParam)
   {
        Console.WriteLine (hWnd.ToInt64());
        return true;
    }

    static void Main()
    {
        EnumWindows (PrintWindow, IntPtr.Zero);
    }
 }

对于回调,它是Hollywood原则(),它声明“不要打电话给我们,我们会打电话给你”。因此,你留下你的电话号码,他们会给你回电话:D现在委托是你的“电话号码”(方法)的形成方式。是的,回调来自user32.dll。pinvoke封送员知道如何使用Marshal.GetFunctionPointerForDelegate()生成一个指针,它可以传递给EnumWindows()。您的问题似乎是“EnumWindow调用PrintWindow是否应该从user32.dll进行?”这实际上是什么意思?该函数位于user32.dll中,但p/invoke的要点(本例以及一般的特性)是使用非托管函数,如托管代码中的函数。如果p/invoke只是从非托管代码调用非托管函数,那么它就不是什么好例子。@Peter-我指的是:static void Main(){EnumWindows(PrintWindow,IntPtr.Zero);}这里,EnumWindows在Main()中调用PrintWindow。要将其视为回调,C代码将调用非托管代码,非托管代码将调用另一个C函数,从而触发回调。这就是我对回调的理解,这就是为什么我在CallBackFun类的main()中使用EnumWindows(PrintWindows…)调用时感到困惑的原因。我试图同时学习封送、委托和回调,这可能会让人困惑。是的,可能会让人困惑。:)委托和回调是一起学习的自然主题,但在尝试深入研究p/invoke问题之前,最好先掌握托管代码中的概念。不幸的是,在你发布的问题中,你并不清楚你到底在问什么;i、 你的问题实际上是什么。