AntonioPelleriti.it [aka z9]

I code, therefore I am

NAVIGATION - SEARCH

Inglobare tutte le dll in un singolo exe e utilizzarle con la Reflection

La stragrande maggioranza delle applicazioni usa delle dll esterne, eventualmente di terze parti.

Quando l'applicazione deve essere distribuita anche gli assembly da cui dipende, cioè tutti i riferimenti esterni devono essere distribuiti assieme all'eseguibile. In generale lo si fa con la classica tecnica Xcopy, prendendo tutto quello che c'è nella cartella Bin/Release prodotta da Visual Studio per esempio, oppure creando un setup ad hoc che si occupi di tutto.

Un'altra possibile tecnica è quella di inglobare tutte le dll all'interno dell'eseguibile e quindi con la comodità di distribuire un solo file.

Supponiamo di avere una semplice applicazione Windows Forms, che utilizza una dll per esempio chiamata MyAssembly.dll.

Al progetto Windows Forms, che avrà un riferimento alla libreria, bisogna apportare una prima modifica, aggiungendo il file MyAssembly.dll come un normale file (click con il destro, Add Existing Item e selezione della dll) e quindi, fra le proprietà del file aggiunto, impostando il valore della proprietà Build Action a Embedded Resource.

A questo punto compilando l'applicazione, l'eseguibile prodotto conterrà la dll come risorsa inglobata. Potete verificarlo con un decompilatore come Reflector o JustDecompile.

 

 

Adesso bisogna fare in modo che a runtime l'applicazione sia in grado di recuperare la dll dalle risorse embedded.

Nel metodo Main dell'applicazione aggiungiamo un gestore dell'evento AssemblyResolve dell'AppDomain corrente:

 static void Main()
 {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
...

 

Il gestore dell'evento, si occupa di ricercare fra le risorse embedded l'assembly (l'evento si scatena al primo utilizzo dell'assembly riferito) e di restituirlo leggendone il contenuto e caricandolo con il metodo Assembly.Load:

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string dllName = new AssemblyName(args.Name).Name + ".dll";

            var asm = Assembly.GetExecutingAssembly();
            String resourceName = asm.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
            if (resourceName == null) return null; // Non trovata

            using (var stream = asm.GetManifestResourceStream(resourceName))
            {
                Byte[] assemblyData = new Byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }

 

 


 

Storia delle versioni di .NET, C# e Visual Studio.

Microsoft ha parlato per la prima volta della nuova piattaforma .NET, originariamente conosciuta come NGWS (Next Generation Web Services) alla conferenza PDC dell'11 luglio 2000. rilasciando una agli sviluppatori una Tech Preview.

La prima Beta 1 di .NET 1.0, vede invece la luce l'1 novembre 2000, seguita da una Beta 2 il 20/06/2001. 

Nella seguente tabelle sono riassunte le successive release della piattaforma .NET, delle specifiche di C# e dell'IDE Visual Studio.

Anno  .NET Framework C# Visual Studio
2002 1.0 1.0 Visual Studio .NET 2002
2003 1.1 1.2 Visual Studio .NET 2003
2005 2.0 2.0 Visual Studio 2005
2006 3.0 2.0
2007 3.5 3.0 Visual Studio 2008
2010 4.0 4.0 Visual Studio 2010
2012 4.5 5.0 Visual Studio 2012
2013 4.5.1 5.0 Visual Studio 2013

Storia delle versioni di .NET, C# e Visual Studio.

.NET Framework Versions, C# Releases, Visual Studio Editions history

 

Build 2013, preview di Windows 8.1, Visual Studio 2013 e .NET Framework 4.5.1

Durante la prima giornata della conferenza Build 2013, grandi novità annunciate per noi sviluppatori .NET!

Oltre alla preannunciata preview di Windows 8.1 (http://windows.microsoft.com/it-it/windows-8/preview) è disponibile per il download anche la nuova versione 2013 Preview di Visual Studio, per iniziare da subito a provare le novità del nuovo sistema operativo.

http://www.microsoft.com/visualstudio/eng#2013-preview

Anche in versione express fra l'altro!

 

Per quanto riguarda invece il .NET Framework annunciata la versione 4.5.1 preview, le cui novità sono riassunte al link

http://blogs.msdn.com/b/dotnet/archive/2013/06/26/announcing-the-net-framework-4-5-1-preview.aspx

di cui, dal punto di vista della produttività dello sviluppatore, possiamo riassumere il contenuto con:

  • X64 edit and continue
  • Async-aware debugging
  • Managed return value inspection
  • ADO.NET idle connection resiliency
  • Improvements in Windows Store app development

Mi piace sottolineare le novità introdotte per lo sviluppo di interfacce grafiche XAML, con un sacco di miglioramenti che ci faranno risparmiare un sacco di tempo, per esempio che ne pensate di poter utilizzare l'intellisense nelle risorse (tipo {StaticResource ...}) o di poter andare alla definizione di un elemento XAML con un F12 (il classico Go to Definition). Qui un bel riassunto direttamente dalla conferenza http://www.irisclasson.com/2013/06/26/build-2013-what-is-new-in-xaml-highlights/

 

Blend 2012: Invalid Markup e [Type] is not supported in a Windows App project

Ho passato un paio di giorni a combattere contro Blend for Visual Studio 2012, che non ne voleva più saperne di aprire in design i file xaml di una soluzione abbastanza complessa.

Il bello è che aveva sempre funzionato, fino a quando senza un motivo apparente, il designer dell'IDE Blend ha iniziato a dare degli errori di Invalid Markup e nella finestra Errors svariate decine di errori del tipo:

Page is not supported in a Windows App project

Window is not supported in a Windows App project

ResourceDictionary is not supported in a Windows App project

Grid is not supported in a Windows App project

 

ecc. ecc.

Ho googolato un pò, ma niente, nessuna soluziona utile, nemmeno una riparazione di Visual Studio ha aiutato.

Fra l'altro Visual Studio 2012 invece apriva correttamente il design e per un pò mi sono adeguato.

Poi ho notato dal Configuration Manager che per uno dei tanti progeti, in particolare una Portable Class Library, non riuscivo più a impostare la modalità di compilazione x86 (rimaneva e potevo selezionare solo Any CPU).

Allora ho pensato di eliminare la configurazione x86 e ricrearla da zero, ed ecco che si è sistemato tutto!

Ora Blend funziona perfettamente!