Il 14 marzo sarò a Mestre per l'evento di XeDotNet, la serata sarà tutta dedicata al nuovo e fiammante engine per la realizzazione di applicazioni a plugin (o come piace al team "AddIn"), cercheremo di capire quali sono le problematiche del mondo reale che hanno portato alla necessità di avere un framework per la gestione degli AddIn, del loro ciclo di vita e soprattutto, e questo è il vero problema, del versioning sia degli AddIn che dell'Host.
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