簡體   English   中英

.NET 4.0 - AccessViolationException和WndProc

[英].NET 4.0 - AccessViolationException and 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錯誤base.WndProc(ref m); 而且我不知道為什么。

顯然,這是從.NET 2.0移植到4.0,我的理論是現在可能有一種替代方法來代替覆蓋WndProc。 這種情況? 如果不是為什么我得到這個例外?

我通過在方法上方添加此屬性來修復它:

[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覆蓋,這仍然會在其他地方崩潰嗎?
  2. 使WndProc只調用“base.WndProc(ref msg)”。 你還得到同樣的錯誤嗎? 什么是callstack? 您的代碼中還有更深層次的代碼嗎?
  3. 隨着代碼段的原樣,這只發生在WM_LBUTTONDOWN? 什么時候拋出異常連接到Deactivate處理程序的東西?

如果這些嘗試不實用,您可能需要更新代碼段以更好地解釋您嘗試執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM