System.AddIn: volete scoprire se fa per voi?
Vediamo un piccolo assaggio di quello di cui parleremo. La necessità, nata da un richiesta sui newsgroup Microsoft, è quella di gesire eventi eventualmente lanciati dagli AddIn all'interno dell'Host.
Per chi ha avuto modo di realizzare un'applicazione a plugin sa che questa non è certo una cosa scontata, il problema è che se l'applicazione è stata realizzata hostando gli AddIn in un appDomain separato di mezzo abbiamo l'infrastruttura di remoting che è tutto tranne che accondiscendente al veicolare eventi dal server verso i client.
In questa direzione il nuovo engine System.AddIn è una vera manna, possiamo infatti fare una cosa del genere:
namespace EventAddIn.Contracts { [AddInContract] public interface IAddInContract : IContract { void DoSomething(); [EventAdd( "AddInEvent" )] void AddInEventAdd( IAddInEvent handler ); [EventRemove( "AddInEvent" )] void AddInEventRemove( IAddInEvent handler ); } [EventHandler] public interface IAddInEvent : IContract { void Handler( IAddInEventArgs args ); } [EventArgs( Cancelable = false )] public interface IAddInEventArgs : IContract { String Value { get; } } }Creiamo un contratto (IAddInContract) che ha, oltre ad un comunissimo metodo ha anche 2 strani metodi marcati con 2 strani attributi, se provate a compilare nonostante abbiate aggiunto le reference a System.AddIn e a System.AddIn.Contracts la compilazione fallisce miseramente perchè non è in grado di risolvere gli attributi EventAdd, EventRemove, EventHandlers e EventArgs. Questi fanno parte dei cosiddetti Pipeline Hints che vengono installati insieme al Pipeline Builder che è un fantastico tool che vi permette di generare tutta la Pipeline "a gratis" (come dicono a Bergamo ;-)), una volta aggiunta una reference a PipelineHint.dll potrete compilare e quello che otterete sarà una cosa del tipo:
static void Main( string[] args ) { IList<IAddIn> addins = new List<IAddIn>(); String[] result = AddInStore.Update( PipelineStoreLocation.ApplicationBase ); IList<AddInToken> tokens = AddInStore.FindAddIns( typeof( IAddIn ), PipelineStoreLocation.ApplicationBase ); foreach( AddInToken token in tokens ) { addins.Add( token.Activate<IAddIn>( AddInSecurityLevel.Internet ) ); } IAddIn addin = addins[ 0 ]; addin.AddInEvent += new EventHandler<AddInEventArgs>( addin_AddInEvent ); addin.DoSomething(); Console.ReadLine(); } static void addin_AddInEvent( object sender, AddInEventArgs e ) { Console.WriteLine( e.Value ); }...che funziona pure :-D
Allora ci si vede a Mestre?
.m