.NET interop是否将生成的非托管thunk缓存到托管方法?

时间:2014-09-11 16:28:17

标签: c# .net winapi interop pinvoke

例如,我使用非托管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?

2 个答案:

答案 0 :(得分:2)

每个代理都有自己的thunk,所以这取决于你如何创建代理。如果您每次调用SetTimer时都创建一个新的委托,那么您将拥有大量的委托。如果为您的课程创建一次,您只会有一个。

答案 1 :(得分:0)

  

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

现在我相信,因为Marshal.GetFunctionPointerForDelegate(timerProc)不断返回相同的值。