2013-04-26 22 views
5

Środowisko

  • Windows 7 x64
  • PostSharp 2.1.7.30 zainstalowany
  • PostSharp 2.1.7.29 (odniesienie pobierane z PostSharp zainstalować katalog)
  • log4net 1.2.11.0 (odniesienie pobierane z katalog net\2.0\release pobierania plików binarnych log4net)
  • Aplikacja ASP.NET 2.0
  • Visual Studio 2010 SP1

Aspect

[Serializable] 
public class MethodBoundaryAspect : PostSharp.Aspects.OnMethodBoundaryAspect 
{ 
    ILog _logger = LogManager.GetLogger("MethodBoundaryAspect"); 

    public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args) 
    { 
     _logger.DebugFormat("The user {0} entered the method {1} at {2}.", 
      HttpContext.Current.Profile.UserName, 
      args.Method.Name, 
      DateTime.Now); 

     base.OnEntry(args); 
    } 

    public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args) 
    { 
     _logger.DebugFormat("The user {0} exited the method {1} at {2}.", 
      HttpContext.Current.Profile.UserName, 
      args.Method.Name, 
      DateTime.Now); 

     base.OnExit(args); 
    } 

    public override void OnException(PostSharp.Aspects.MethodExecutionArgs args) 
    { 
     _logger.DebugFormat("The user {0} was executing the method {1} when an unhandled exception occurred at {2}.{3}{4}", 
      HttpContext.Current.Profile.UserName, 
      args.Method.Name, 
      DateTime.Now, 
      Environment.NewLine, 
      args.Exception.ToString()); 

     base.OnException(args); 
    } 
} 

Błąd kompilacji

Nie można serializować aspektach: typ 'log4net.Core.LogImpl' w log4net montażowych, Version = 1.2. 11.0, Culture = neutral, PublicKeyToken = 669e0ddf0bb1aa2a 'nie jest oznaczony jako możliwy do serializacji.Otrzymuję komunikat "Nie można sparametryzować aspektów: wpisz" log4net.Core.LogImpl "w zespole" log4net ... "" - w jaki sposób mogę dokonać serializacji?

Jak mogę przekształcić log4net.Core.LogImpl w wersję szeregową, aby móc skompilować to rozwiązanie?

+0

Umieść program rejestrujący poza klasą jako obiekt statyczny. Utwórz nową metodę wewnątrz klasy, która najpierw zainicjuje rejestrator. – mtsiakiris

+0

Ponadto masz klasę serializowalną, która nie ma żadnych członków (właściwości) do serializacji. (!) – mtsiakiris

+1

Będziesz musiał wykonać ręczną serializację. –

Odpowiedz

10

Na podstawie uwag Grant i mtsiakiris I rozwiązać ten problem poprzez dodanie atrybutu [NonSerialized] pola tak:

[NonSerialized] 
ILog _logger = LogManager.GetLogger("MethodBoundaryAspect"); 

który potem po prostu zignorował to podczas serializacji. Powodem tego jest to, że PostSharp musi serializować atrybut podczas generacji IL.