2012-08-17 27 views
8

Tôi có đoạn mã này:.NET 4.0 - AccessViolationException và 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); 
    } 
} 

Khi tôi chạy chương trình của tôi, tôi nhận được một lỗi AccessViolationException tại dòng base.WndProc(ref m); và tôi không biết tại sao.

Dường như điều này đã được chuyển từ .NET 2.0 đến 4.0 và lý thuyết của tôi là có thể có một phương pháp thay thế được sử dụng thay cho WndProc. Đây có phải là trường hợp này không? Nếu không phải lý do tại sao tôi nhận được ngoại lệ này?

+0

Bạn có thể cung cấp đầy đủ hơn một chút mẫu không? Ít nhất cho thấy cách bạn đang tạo cửa sổ MTool và hiển thị nó? Tôi muốn chắc chắn rằng repro của tôi ở gần bạn. – Tim

+0

Vì vậy, bạn không thực sự hiển thị nó ở bất kỳ địa điểm cụ thể nào, chỉ cần tạo đối tượng? Bạn không cần phải gọi CreateHandle hoặc một cái gì đó như thế cho NativeWindow là hữu ích? – Tim

+0

Bạn đã thử đặt một breakpoint trên base.WndProc và nhìn thấy giá trị của m là gì khi ngoại lệ được nâng lên ... cũng không bao giờ làm việc cho một số m hoặc nó ném ngoại lệ lần đầu tiên nó được gọi .. –

Trả lời

7

tôi cố định nó bằng cách thêm thuộc tính này trên phương pháp:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions] 

Sau đó, xung quanh dòng nơi ngoại lệ xảy ra với một try/catch. Tôi đã tìm thấy thông tin này here.

+2

Sẽ không tốt hơn nếu bạn tìm ra nguyên nhân gây ra ngoại lệ và cố khắc phục điều đó? – MikeKulls

1

Tài liệu dành cho WndProc thể hiện sự tin tưởng đầy đủ. bạn đã thử nó chưa ví dụ:

[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

Đã thử rằng, vẫn nhận được ngoại lệ tương tự. –

0

Tôi nghi ngờ có điều gì đó lớn hơn xảy ra trong mã của bạn. Dựa trên đoạn mã của bạn, tôi sẽ thử:

  1. Nhận xét việc ghi đè WndProc, điều này vẫn repro bằng cách rơi ở một nơi khác?
  2. Đặt WndProc chỉ gọi "base.WndProc (ref msg)". Bạn vẫn nhận được lỗi tương tự? Callstack là gì? Có thêm mã nào của bạn sâu hơn trong ngăn xếp không?
  3. Với đoạn nội dung, điều này chỉ xảy ra khi WM_LBUTTONDOWN? Khi điều này ném ngoại lệ đó, cái gì được nối với trình xử lý Tắt kích hoạt đó?

Nếu không thực tế, bạn có thể cần phải cập nhật đoạn mã để giải thích rõ hơn những gì bạn đang cố gắng làm.

+2

Tôi khuyên bạn không nên sử dụng HPCSEAttribute để giải quyết vấn đề này. Điều gì có thể xảy ra là mã được quản lý của bạn là ném một ngoại lệ, hoặc có một ngoại lệ marshalling (làm thế nào bạn xây dựng ptrStruct?). Khi bạn có mã dệt vào và ra khỏi bản địa nó mất bối cảnh của ngoại lệ ban đầu và cuối cùng bề mặt như một cái gì đó mà CLR không nghĩ rằng nó có thể bắt. Thuộc tính bạn đã gắn cờ là câu trả lời chính xác có lẽ là sự khác biệt trong lý do tại sao điều này được sử dụng để hoạt động, nhưng có một vấn đề sâu hơn đang bị ẩn. Bạn thực sự nên gỡ lỗi này nhiều hơn. –