Risoluzione di assembly in fase di progettazione
Quando si aggiunge un riferimento a un assembly nella scheda .NET della finestra di dialogo Aggiungi Riferimento, il riferimento punta ad un riferimento assembly intermedio, ovvero, un assembly contenente informazioni su tutti i tipi e sulla firma, ma che non contiene necessariamente alcun codice. Nella scheda .NET sono elencati gli assembly di riferimento corrispondenti agli assembly di runtime in .NET Framework. Sono inoltre elencati gli assembly di riferimento corrispondenti agli assembly di runtime nelle cartelle AssemblyFoldersEx registrate utilizzate da terzi.
Multitargeting
Visual Studio 2013 permette di specificare come target versioni di .NET Framework eseguite in Common Language Runtime (CLR) versione 2.0 oppure versione 4. Tra queste sono incluse le versioni 2.0, 3.0, 3.5, 4, 4.5 e 4.5.1 di .NET Framework e le versioni 1.0, 2.0, e 3.0 di Silverlight. Se viene rilasciata una nuova versione di .NET Framework basata su CLR versione 2.0 o 4, il framework può essere installato tramite un Targeting Pack, dopo di che verrà automaticamente visualizzato come destinazione in Visual Studio.
Funzionamento della risoluzione dei tipi
In fase di esecuzione CLR risolve i tipi nell'assembly eseguendo ricerche nella GAC, nella directory bin e in tutti i percorsi di sondaggio. Questa operazione è gestita dal caricatore Fusion. Ma come può il caricatore Fusion sapere cosa sta cercando? Ciò dipende da una risoluzione effettuata in fase di progettazione, quando l'applicazione viene compilata.
Durante la compilazione, il compilatore risolve i tipi dell'applicazione tramite assembly di riferimento. Nel caso di .NET Framework versioni 2.0, 3.0 e 3.5, 4, 4.5, e 4.5.1, gli assembly di riferimento vengono installati contemporaneamente a .NET Framework.
Gli assembly di riferimento sono forniti dal pacchetto di targeting incluso con la corrispondente versione di .NET Framework SDK. Il framework in sé fornisce soltanto gli assembly di runtime. Per compilare le applicazioni è necessario installare sia .NET Framework che la versione corrispondente di .NET Framework SDK.
Quando si sceglie come destinazione una versione di .NET Framework specifica, il sistema di compilazione risolve tutti i tipi tramite gli assembly di riferimento contenuti nel Targeting Pack. In fase di esecuzione, il caricatore Fusion risolve questi stessi tipi negli assembly di runtime, che in genere si trovano nella GAC.
Se gli assembly di riferimento non sono disponibili, il sistema di compilazione risolve i tipi degli assembly tramite gli assembly di runtime. Poiché gli assembly di runtime nella GAC non sono distinti da numeri di versione secondaria, è possibile che la risoluzione verrà eseguita nell'assembly errato. Questo può accadere, ad esempio, se si fa riferimento a un nuovo metodo introdotto in .NET Framework versione 3.5 avendo come destinazione la versione 3.0. La compilazione avrà esito positivo e l'applicazione verrà eseguita nel computer di compilazione; l'esito sarà però negativo in caso di distribuzione in un computer in cui non è presente la versione 3.5.
Il Targeting Pack fornito ora con .NET Framework SDK include un elenco di tutti gli assembly di runtime contenuti in quella versione del framework, definito elenco di ridistribuzione (redist). Grazie a questo elenco diventa impossibile, per il sistema di compilazione, risolvere i tipi a fronte di una versione dell'assembly errata.