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