例如,我使用非托管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);
我想知道传递给实际lpTimerFunc
API的SetTimer
的非托管指针是否保持相同,因为托管timerProc
重新发送相同,无论多少次我打电话给NativeMethods.SetTimer
?或者,每次拨打timerProc
时,是否会为NativeMethods.SetTimer
生成新的非托管thunk?
答案 0 :(得分:2)
每个代理都有自己的thunk,所以这取决于你如何创建代理。如果您每次调用SetTimer时都创建一个新的委托,那么您将拥有大量的委托。如果为您的课程创建一次,您只会有一个。
答案 1 :(得分:0)
.NET interop是否将生成的非托管thunk缓存到托管 方法
现在我相信,因为Marshal.GetFunctionPointerForDelegate(timerProc)
不断返回相同的值。