2012-08-17 65 views
8

我有這樣的代碼片段:.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); 
    } 
} 

當我運行我的節目,我在該行base.WndProc(ref m);得到一個AccessViolationException錯誤,我不知道爲什麼。

顯然,這是從.NET 2.0移植到4.0和我的理論是,有可能在適當位置重寫的WndProc的現在使用的替代方法。這種情況?如果不是,我爲什麼會得到這個異常?

+0

你能提供一個更完整的樣本嗎?至少要說明你如何創建MTool窗口並顯示它?我想確保我的repro接近你的。 – Tim 2012-08-20 17:29:19

+0

所以你實際上並沒有展示它的任何特定的地方,只是創建對象?你不需要爲NativeWindow調用CreateHandle之類的東西嗎? – Tim 2012-08-20 19:10:24

+0

你試過穿上base.WndProc斷點,看到的是,當引發異常的m的值...也做它曾經爲幾μm工作或它拋出異常的第一次調用.. – 2012-08-24 10:21:57

回答

7

我固定它通過將上述方法該屬性:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions] 

然後圍繞在異常用的try/catch發生的行。我發現這個信息here

+2

找出造成異常的原因並嘗試解決這個問題不是更好嗎? – MikeKulls 2012-08-27 01:05:36

1

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) 
    { 
//... 
+0

試過,仍然得到相同的異常。 – 2012-08-20 17:34:43

0

我懷疑你的代碼中發生了更大的事情。基於你的片段,我會嘗試:

  1. 註釋掉WndProc覆蓋,這是否仍然通過其他地方崩潰repro?
  2. 讓WndProc中只調用 「base.WndProc(REF MSG)」。你仍然得到同樣的錯誤?什麼是callstack?堆棧中是否還有更多的代碼?
  3. 現在的代碼片段只有在WM_LBUTTONDOWN時纔會發生?當這拋出異常什麼是掛鉤到該停用處理程序?

如果這些不切實際的嘗試,你可能需要更新片段來更好地解釋你正在嘗試做什麼。

+2

我強烈建議不要使用HP​​CSEAttribute來解決此問題。可能發生的事情是您的託管代碼拋出異常,或者有一個編組異常(您是如何構建ptrStruct的?)。當代碼編譯進出本機時,它會丟失原始異常的上下文,並最終顯示爲CLR認爲它不會捕獲的東西。您標記爲正確答案的屬性可能與以往工作原因不同,但存在隱藏的更深層問題。你真的應該更多地進行調試。 – 2012-08-21 16:01:11