.NET互操作是否将生成的非托管thunk缓存到托管方法

本文关键字:thunk 缓存 方法 是否 互操作 NET | 更新日期: 2023-09-27 18:21:30

例如,我使用非托管Win32计时器:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void TimerProc(IntPtr hWnd, uint uMsg, IntPtr nIDEvent, uint dwTime);
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr SetTimer(IntPtr hWnd, IntPtr nIDEvent, 
    uint uElapse, TimerProc lpTimerFunc);
// ...
TimerProc timerProc = delegate { this.Beep(); };
// ...
var timerId = NativeMethods.SetTimer(IntPtr.Zero, IntPtr.Zero, 500, timerProc);

我想知道,无论我调用NativeMethods.SetTimer多少次,传递给实际SetTimer API的lpTimerFunc的非托管指针是否在托管timerProc重新传输相同的时间内保持相同?还是每次调用NativeMethods.SetTimer时都会为timerProc生成一个新的非托管thunk?

.NET互操作是否将生成的非托管thunk缓存到托管方法

每个委托都有自己的thunk,因此这取决于您如何创建委托。如果每次调用SetTimer时都创建一个新的代理,则会有很多代理。如果为您的类创建一次,那么您将只有一个。