Domanda

Sto lavorando con PostSharp per intercettare le chiamate ai metodi su oggetti che non possiedo, ma il mio codice aspetto non sembra essere chiamato.La documentazione sembra piuttosto trascurata nell'area Silverlight, quindi apprezzerei qualsiasi aiuto possiate offrirmi :)

Ho un attributo che assomiglia a:

public class LogAttribute : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        // Logging code goes here...
    }
}

E una voce nel mio AssemblyInfo che assomiglia a:

[assembly: Log(AttributeTargetAssemblies = "System.Windows", AttributeTargetTypes = "System.Windows.Controls.*")]

Quindi la mia domanda per te è...cosa mi manca?Le chiamate al metodo con destinazioni di attributi corrispondenti non sembrano funzionare.

È stato utile?

Soluzione

Ciò non è possibile con l'attuale versione di PostSharp.

PostSharp funziona trasformando gli assiemi prima di essere caricati da CLR.In questo momento, per fare ciò, devono accadere due cose:

  • L'assembly deve essere in procinto di essere caricato nel CLR;hai solo una possibilità e devi prenderla a questo punto.
  • Al termine della fase di trasformazione, non è possibile apportare ulteriori modifiche.Ciò significa che non è possibile modificare l'assembly in fase di esecuzione.

La versione più recente, 1.5 CTP 3, rimuove la prima di queste due limitazioni, ma è il secondo il vero problema.Questo è, tuttavia, una funzionalità molto richiesta, quindi tieni gli occhi aperti:

Gli utenti spesso chiedono se è possibile utilizzare PostSharp in fase di runtime, quindi non è necessario conoscerne gli aspetti in fase di compilazione.Modificare gli aspetti dopo la distribuzione è infatti un grande vantaggio, poiché consente al personale di supporto di abilitare/disabilitare il tracciamento o il monitoraggio delle prestazioni per singole parti del software. Una delle cose interessanti che consentirebbe è di applicare aspetti su assiemi di terze parti.

Se chiedi se è possibile, la risposta breve è sì! Sfortunatamente, la risposta lunga è più complessa.

Trucchi sull'aspetto runtime/di terze parti

L'autore procede inoltre descrivendo alcuni dei problemi che si verificano se si consente la modifica in fase di esecuzione:

Quindi ora, quali sono i trucchi?

  • Collegamento del bootstrapper. Se il codice è ospitato (ad esempio in ASP.NET o in un server COM), non è possibile collegare Bootstrapper.Quindi qualsiasi tecnologia di tessitura di runtime è vincolata alla limitazione che dovresti ospitare l'applicazione da solo.
  • Essere davanti al CLR. Se il CLR trova da solo l'assemblaggio non trasformato, non chiederà quello trasformato.Quindi potrebbe essere necessario creare un nuovo dominio dell'applicazione per l'applicazione trasformata e inserire assiemi trasformati nel suo percorso binario.Forse non è un grosso problema.
  • Nomi forti. Bene.Se si modifica un gruppo in fase di esecuzione, dovrai rimuovere il suo nome forte.Funzionerà?Sì, soprattutto.Naturalmente, devi rimuovere i nomi forti da tutti i riferimenti a questa assemblea.Non è un problema;PostSharp lo supporta fuori dalla scatola.Ma c'è qualcosa che PostSharp non può fare a meno di:Se ci sono alcuni riferimenti fortemente denominati in stringhe o file (ad esempio in app.config), difficilmente possiamo trovarli e trasformarli.Quindi qui abbiamo una vera limitazione:Non ci possono essere "riferimenti sciolti" per le assemblee fortemente nominate:Siamo in grado di trasformare solo riferimenti reali.
  • Carica da. Se un gruppo utilizza Assembly.loadFrom, Assembly.loadFile o Assembly.loadBytes, il nostro bootstrapper viene saltato.

Altri suggerimenti

Credo che se cambi AttributeTargetAssemblies in "PresentationFramework", potrebbe funzionare.(Non ho ancora PostSharp così bene).

L'assembly per WPF è PresentationFramework.dll.AttributeTargetAssemblies necessita della DLL a cui dovrebbe mirare.

PostSharp ha una nuova versione, a cui si accede dal collegamento della pagina Download a "Tutti i download".

PostSharp 1.5Il ramo di sviluppo di PostSharp che include nuove funzionalità come il supporto per Mono, Compact Framework o Silverlight e l'ereditarietà degli aspetti.Scarica da questo ramo se vuoi provare nuove funzionalità e aiutare la comunità testando nuovi sviluppi e puoi accettare un'affidabilità e una stabilità inferiori delle API.

La versione è attualmente a 1.5 CTP 3 ma ha il supporto per Silverlight.

Se stai tentando di intercettare le chiamate all'interno del framework (ovvero, non nel tuo codice), non funzionerà.PostSharp può sostituire solo il codice all'interno del tuo assembly.Se stai cercando di intercettare le chiamate che stai effettuando, sembra che dovrebbe funzionare.Vedi PostSharp in esecuzione nell'output della build?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top