2012-08-17 18 views
8

que tienen este fragmento de código:.NET 4.0 - AccessViolationException y 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); 
    } 
} 

Cuando ejecuto mi programa me sale un error en la línea de AccessViolationException base.WndProc(ref m); y no sé qué.

Aparentemente esto se transfirió de .NET 2.0 a 4.0 y mi teoría es que puede haber un método alternativo utilizado ahora en lugar de anular WndProc. Es este caso? Si no, ¿por qué recibo esta excepción?

+0

¿Podría proporcionar un poco más de una muestra? ¿Al menos muestra cómo estás creando la ventana de MTool y mostrándola? Quiero asegurarme de que mi repro esté cerca del tuyo. – Tim

+0

¿De modo que no estás mostrando ningún lugar en particular, solo creando el objeto? ¿No necesita usar CreateHandle o algo así para que NativeWindow sea útil? – Tim

+0

Ha intentado poner un punto de interrupción en la base.WndProc y viendo cuál es el valor de m cuando se produce una excepción ... también funciona alguna vez o hace una excepción la primera vez que se invoca .. –

Respuesta

7

me fijo mediante la adición de este atributo por encima del método:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions] 

Entonces que rodea la línea donde se produce la excepción con un try/catch. Encontré esta información here.

+2

¿No sería mejor averiguar qué está causando la excepción y tratar de solucionarlo? – MikeKulls

1

La documentación para WndProc muestra la exigencia plena confianza. ¿Has probado eso? e.g .:

[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

Intenté eso, obteniendo la misma excepción. –

0

Sospecho que hay algo más grande sucediendo en su código. En función de su fragmento de código, probaría:

  1. Comente la anulación de WndProc, ¿esto todavía se reproduce al bloquearse en otro lugar?
  2. Haga que el WndProc solo invoque "base.WndProc (ref msg)". ¿Todavía obtienes el mismo error? ¿Cuál es la pila de llamadas? ¿Hay más de tu código más profundo en la pila?
  3. Con el fragmento tal como está, ¿esto solo sucede cuando WM_LBUTTONDOWN? Cuando esto arroja esa excepción, ¿qué está enganchado a ese controlador Deactivate?

Si no es práctico intentarlo, probablemente necesite actualizar el fragmento para explicar mejor lo que está tratando de hacer.

+2

Recomiendo enfáticamente que no se use HPCSEAttribute para resolver esto. Lo que probablemente está sucediendo es que su código administrado arroje una excepción, o hay una excepción de clasificación (¿cómo construyó ptrStruct?). Cuando se tiene código entrando y saliendo del idioma nativo, se está perdiendo el contexto de la excepción original y finalmente aparece como algo que el CLR no cree que pueda captar. El atributo que marcó como la respuesta correcta es probablemente la diferencia en el por qué esto solía funcionar, pero hay un problema más profundo que se oculta. Realmente deberías depurar esto más. –