Pacchetti del framework MSIX e dipendenze dinamiche

Questo articolo presenta concetti importanti relativi ai pacchetti framework MSIX. Le informazioni contenute in questo articolo forniscono un contesto utile per comprendere meglio la progettazione e lo scopo della funzionalità delle dipendenze dinamiche in Windows App SDK e nel sistema operativo Windows 11. Questa funzionalità consente alle app di fare riferimento e usare pacchetti framework MSIX in fase di esecuzione.

Pacchetti framework e grafico dei pacchetti

MSIX è un formato di pacchetto che offre un'esperienza moderna di creazione di pacchetti e distribuzione. Offre anche un modo pulito e attendibile per creare pacchetti di librerie ridistribuibili, contenuto e componenti tramite pacchetti framework MSIX. Un pacchetto framework MSIX consente alle app in pacchetto di accedere ai componenti tramite una singola origine condivisa nel dispositivo dell'utente, invece di raggrupparle nel pacchetto dell'app. I pacchetti framework comuni includono Windows App SDK (inclusi WinUI3), WinUI2, VCLibs e DirectX Runtime.

A partire da Windows 8 e continuando con Windows 10 e Windows 11, ogni processo include un grafico dei pacchetti che fornisce l'elenco di tutti i pacchetti disponibili per l'app, inclusi framework, risorse, pacchetti facoltativi e principali. Questo grafico consente all'app di caricare DLL, contenuto e dichiarazioni di classe di runtime fornite da un pacchetto a cui si fa riferimento. Storicamente, questo grafico è stato risolto in fase di creazione del processo e non è stato possibile modificarlo in fase di esecuzione:

  • Per le app in pacchetto, il grafico è stato inizializzato in base alle dipendenze del pacchetto dichiarate nell'elemento PackageDependency nel manifesto del pacchetto dell'app. Quando si compila un'app in pacchetto, questa operazione viene in genere eseguita durante il processo di compilazione, in base ai riferimenti e alle dipendenze del progetto.
  • Per le app non in pacchetto, il grafico del pacchetto era vuoto e non poteva essere modificato. Pertanto, le app non in pacchetto erano limitate all'ordine di ricerca DLL standard e non potevano accedere ai pacchetti framework.

Questa restrizione del grafico dei pacchetti statici viene rimossa con l'introduzione del supporto delle dipendenze dinamiche sia in Windows App SDK che in Windows 11. Gli sviluppatori possono usare dipendenze dinamiche per fare riferimento ai pacchetti framework MSIX dalle app in fase di esecuzione. Le dipendenze dinamiche rimuovono la restrizione del grafico dei pacchetti statici dalle app e gli sviluppatori possono decidere come sfruttare i pacchetti framework.

Scenari principali per le dipendenze dinamiche

Anche se le dipendenze dinamiche consentono a qualsiasi app di aggiungere una dipendenza del framework del pacchetto in fase di esecuzione, questa funzionalità è destinata principalmente all'uso da parte delle app in pacchetto con percorso esterno o alle app non in pacchetto. Le app in pacchetto possono comunque continuare ad aggiungere dipendenze statiche tramite l'elemento PackageDependency nel manifesto del pacchetto.

Modello di manutenzione per i pacchetti framework

La funzionalità delle dipendenze dinamiche mantiene l'integrità della pipeline di manutenzione per il pacchetto framework a cui viene fatto riferimento e usato in modo dinamico in fase di esecuzione.

I pacchetti framework MSIX supportano la manutenzione in un modello side-by-side, ovvero ogni versione viene installata nella propria cartella separata con controllo delle versioni. Ciò consente alle applicazioni in uso di rimanere in esecuzione anche quando un'app più recente installa una versione più recente del pacchetto framework. Il sistema operativo dispone della logica di disinstallazione per quando eliminare le versioni precedenti di un determinato pacchetto framework, in base alla presenza di riferimenti in fase di installazione e riferimenti runtime per il pacchetto.

  • Quando un'app è installata, può creare un riferimento in fase di installazione a un pacchetto framework. Questo riferimento informa il sistema operativo che l'app ha una dipendenza dal pacchetto framework specificato, in modo che il sistema operativo non disinstalli il pacchetto framework mentre l'app è installata.
  • Quando un'app deve usare API o contenuto in un pacchetto framework, può aggiungere un riferimento runtime al pacchetto framework. Questo riferimento informa il sistema operativo che il pacchetto framework è in uso attivo e di gestire gli aggiornamenti delle versioni in modo side-by-side. Se è installata una nuova versione del pacchetto framework, ma un'app in esecuzione ha una versione precedente in uso, il sistema operativo non può rimuovere la versione precedente finché non vengono rimossi tutti i riferimenti runtime alla versione precedente.

Ad esempio, dato questo scenario:

  • L'app A è in esecuzione e usa la versione 1.0.0.0 di un determinato pacchetto framework.
  • L'app B è installata e ha una dipendenza dalla versione 1.0.0.1 dello stesso pacchetto framework.

In questo scenario, entrambe le versioni del pacchetto framework verranno installate e usate dall'app A e dall'app B. Tuttavia, quando l'app A viene chiusa dall'utente e quindi riavviata, rileverà la versione più recente 1.0.0.1 del pacchetto framework. A questo punto, il requisito di riferimento runtime non è più valido per la versione 1.0.0.0 del pacchetto framework e il sistema operativo può rimuovere in modo sicuro la versione 1.0.0.0. Successivamente, quando l'app A e l'app B vengono disinstallate dall'utente, il requisito di riferimento in fase di installazione non è più valido e il sistema operativo può rimuovere completamente e in sicurezza il pacchetto framework.

Per le app in pacchetto che usano l'elemento PackageDependency per specificare riferimenti statici ai pacchetti framework, i riferimenti in fase di installazione per i pacchetti framework vengono rilevati dal sistema operativo quando l'app viene installata o disinstallata. Per i riferimenti in fase di esecuzione gestiti tramite la funzionalità delle dipendenze dinamiche, il sistema operativo sa quando un'app in pacchetto è in esecuzione ed eviterà di rimuovere i pacchetti framework in uso, quando ne è disponibile uno più recente.