2011-06-16 21 views
7

Estoy ejecutando una aplicación web .NET 4.0 (no sitio web) y PostSharp 1.5. No puedo ejecutar el método de anulación OnEntry con la clase base OnMethodBoundaryAspect. Aquí hay algunos códigos relevantes:PostSharp OnMethodBoundaryAspect OnEntry No se está ejecutando

public sealed class MonitorAttribute : OnMethodBoundaryAspect { 

    public string[] SomeValue { get; protected set; }   

    public MonitorAttribute (params string[] someValue){ 
     SomeValue = someValue; 
    } 

    public override void OnEntry(MethodExecutionEventArgs eventArgs){ 
     // do Something here 
     base.OnEntry(eventArgs); 
    } 

} 

public sealed class MyUsageClass : IMyUsageClass { 

    [Monitor(new string[]{ 'Test' }) 
    public void SomeMethod { 
     // Do something else in here 
    }   

} 

¿Emite algo más? Nunca golpea el método OnEntry. También traté de reemplazar mis dependencias PostSharp.dll y PostSharp.Laos.dll con la nueva versión 2.0. Si se produce alguna diferencia, MyUsageClass es instanciado por StructureMap.

+0

Uso ILSpy (o reflector) y examinar su método después de tiempo de compilación. El método de destino debe tener una try/catch alrededor o, al menos, una llamada al método OnEntry del aspecto en la parte superior del cuerpo del método. –

+0

Muy bueno. Estoy descargando ILSpy ahora ... Volveré a publicar pronto. ¡Gracias! – a432511

+0

Ok. Al observar el método a través de ILSpy, no veo una llamada a OnEntry en la parte superior del cuerpo del método. – a432511

Respuesta

2

Sí, todo desarrollador deberá instalar PostSharp. Si solo estás usando la edición inicial, todo es gratis.

Publicando esto como una respuesta para mostrarle el código. Mi prueba de código

class Program 
    { 
     [Monitor] 
     static void Main(string[] args) 
     { 

     } 
    } 

    [Serializable] 
    public class MonitorAttribute : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      Console.WriteLine("OnEntry"); 
     } 
    } 

El código después de la compilación

internal class Program 
    { 
     [CompilerGenerated, DebuggerNonUserCode] 
     internal sealed class <>z__Aspects 
     { 
      internal static MethodBase m1 = MethodBase.GetMethodFromHandle(ldtoken(Main())); 
      internal static readonly MonitorAttribute a0 = (MonitorAttribute)<>z__AspectsImplementationDetails.aspects1[0]; 
     } 
     private static void Main(string[] args) 
     { 
      Program.<>z__Aspects.a0.OnEntry(null); 
     } 
    } 
+0

Ok, estaba repasando la documentación en el sitio web de PostSharps y parece que tengo que hacer una instalación completa de PostSharp en mi máquina. ¡Gracias por toda tu ayuda! – a432511

Cuestiones relacionadas