.NET 4.0 – AccessViolationException和WndProc

我有这个代码片段:

internal class MTool : NativeWindow { private const int WM_LBUTTONDOWN = 0x0201; public event TipDeactivateEventHandler Deactivate; protected override void WndProc(ref System.Windows.Forms.Message m) { if( m.Msg == WM_LBUTTONDOWN ) { if( this.Deactivate != null) { this.Deactivate(); } } base.WndProc(ref m); } } 

当我运行我的程序,我得到一个AccessViolationException错误在线base.WndProc(ref m); 我不知道为什么。

显然这是从.NET 2.0移植到4.0,我的理论是,现在可能有一个替代方法用来取代WndProc。 这是吗? 如果不是我为什么得到这个exception?

我通过在方法上面添加这个属性来修复它:

 [System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions] 

然后围绕try / catch发生异常的那一行。 我在这里找到了这个信息。

WndProc的文档显示要求完全信任。 你试过了吗? 例如:

 [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] internal class MTool : NativeWindow { [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] protected override void WndProc(ref Message m) { //... 

我怀疑你的代码中有更大的事情发生。 基于你的片段,我会尝试:

  1. 注释掉WndProc覆盖,这还是通过崩溃在其他地方的repro?
  2. 使WndProc只调用“base.WndProc(ref msg)”。 你仍然得到同样的错误? 什么是callstack? 在堆栈中还有更多的代码吗?
  3. 与原来的代码片段,这是唯一发生在WM_LBUTTONDOWN? 当这抛出异常什么是挂钩到该停用处理程序?

如果这些不切实际的尝试,你可能需要更新片段,以更好地解释你正在尝试做什么。