L’avevo intravista tempo fa utilizzata in un eseguibile che guardavo con reflector, oggi l’ho provata: carina!

Quando si fanno degli eseguibili semplici che magari utilizzano un componente esterno (una reference di una dll esterna) si puo’ fare in modo di distribuire un unico exe con embeddate dentro le dll referenziate.

Di solito per avere un unico exe utilizzavo il comando IlMerge e le sue varie GUI, con questa tecnica si fa a meno.

Facciamo un esempio: mettiamo il caso che il mio programmino faccia uso di SharpZipLib per produrre degli zip. Per fare in modo di distribuire solo il mio exe, senza dover dare a parte la dll di SharpZipLib, procediamo in questo modo:

Innanzi tutto usiamo la dll come reference nel progetto come al solito:
Include01

Aggiungiamola anche come risorsa embedded nel nostro assembly:
Include02

A questo punto nel ‘Main’ dell’applicazione scriviamo una cosa del genere:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
    {
        return Assembly.Load(Properties.Resources.ICSharpCode_SharpZipLib);
    };

    Application.Run(new Form1());
}

E voilà, il gioco è fatto: il nostro eseguibile peserà un po di più ma dovremo distribuire solo quello… comodo non c’è che dire.