Condividi tramite


Compilazione di assembly side-by-side C/C++

Un assembly side-by-side è una raccolta di risorse, ovvero un gruppo di DLL, classi windows, server COM, librerie dei tipi o interfacce, disponibile per un'applicazione in fase di esecuzione. Il vantaggio principale della ricompressione delle DLL negli assembly è che più versioni degli assembly possono essere usate contemporaneamente dalle applicazioni ed è possibile gestire gli assembly attualmente installati in caso di versione di aggiornamento.

Un'applicazione C++ può usare una o più DLL in parti diverse dell'applicazione. In fase di esecuzione, le DLL vengono caricate nel processo principale e il codice richiesto viene eseguito. L'applicazione si basa sul sistema operativo per individuare le DLL richieste, comprendere quali altre DLL dipendenti devono essere caricate e quindi caricarle insieme alla DLL richiesta. Nelle versioni dei sistemi operativi Windows precedenti a Windows XP, Windows Server 2003 e Windows Vista, il caricatore del sistema operativo cerca DLL dipendenti nella cartella locale dell'applicazione o in un'altra cartella specificata nel percorso di sistema. In Windows XP, Windows Server 2003 e Windows Vista, il caricatore del sistema operativo può anche cercare DLL dipendenti usando un file manifesto e cercare assembly side-by-side contenenti queste DLL.

Per impostazione predefinita, quando una DLL viene compilata con Visual Studio, ha un manifesto dell'applicazione incorporato come risorsa RT_MANIFEST con ID uguale a 2. Proprio come per un eseguibile, questo manifesto descrive le dipendenze di questa DLL in altri assembly. Ciò presuppone che la DLL non faccia parte di un assembly side-by-side e delle applicazioni che dipendono da questa DLL non useranno un manifesto dell'applicazione per caricarlo, ma si basano invece sul caricatore del sistema operativo per trovare questa DLL nel percorso di sistema.

Nota

È importante che una DLL che usi un manifesto dell'applicazione per incorporare il manifesto come risorsa con ID uguale a 2. Se la DLL viene caricata dinamicamente in fase di esecuzione ,ad esempio usando la funzione LoadLibrary , il caricatore del sistema operativo carica gli assembly dipendenti specificati nel manifesto della DLL. Durante una chiamata non viene controllato un LoadLibrary manifesto dell'applicazione esterno per le DLL. Se il manifesto non è incorporato, il caricatore potrebbe tentare di caricare versioni non corrette degli assembly o di trovare assembly dipendenti.

Una o più DLL correlate possono essere riassemblate in un assembly side-by-side con un manifesto dell'assembly corrispondente, che descrive quali file formano l'assembly, nonché la dipendenza dell'assembly da altri assembly affiancati.

Nota

Se un assembly contiene una DLL, è consigliabile incorporare il manifesto dell'assembly in questa DLL come risorsa con ID uguale a 1 e assegnare all'assembly privato lo stesso nome della DLL. Ad esempio, se il nome della DLL è mylibrary.dll, il valore dell'attributo name usato nell'elemento <assemblyIdentity> del manifesto può anche essere mylibrary. In alcuni casi, quando una libreria ha un'estensione diversa da .dll (ad esempio, un progetto Controlli ActiveX MFC crea una libreria con estensione ocx) è possibile creare un manifesto dell'assembly esterno. In questo caso, il nome dell'assembly e il relativo manifesto devono essere diversi dal nome della DLL, ad esempio MyAssembly, MyAssembly.manifest e mylibrary.ocx. Tuttavia, è comunque consigliabile rinominare tali librerie per avere il extension.dll e incorporare il manifesto come risorsa per ridurre il costo di manutenzione futuro di questo assembly. Per altre informazioni su come il sistema operativo cerca assembly privati, vedere Sequenza di ricerca assembly.

Questa modifica può consentire la distribuzione di DLL corrispondenti come assembly privato in una cartella locale dell'applicazione o come assembly condiviso nella cache degli assembly WinSxS. Per ottenere un comportamento di runtime corretto di questo nuovo assembly, è necessario seguire diversi passaggi; sono descritte in Linee guida per la creazione di assembly affiancati. Dopo che un assembly è stato creato correttamente, può essere distribuito come assembly condiviso o privato insieme a un'applicazione che dipende da esso. Quando si installano assembly side-by-side come assembly condiviso, è possibile seguire le linee guida descritte in Installazione di assembly Win32 per la condivisione side-by-side in Windows XP o usare moduli di merge. Quando si installano assembly side-by-side come assembly privato, è sufficiente copiare la DLL, le risorse e il manifesto dell'assembly corrispondenti come parte del processo di installazione nella cartella locale dell'applicazione nel computer di destinazione, assicurandosi che questo assembly sia disponibile dal caricatore in fase di esecuzione (vedere Sequenza di ricerca assembly). Un altro modo consiste nell'usare Windows Installer e seguire le linee guida descritte in Installazione di assembly Win32 per l'uso privato di un'applicazione in Windows XP.

Vedi anche

Compilazione di applicazioni isolate C/C++
Compilazione di applicazioni isolate C/C++ e di assembly side-by-side