Applicazioni MSIX AppContainer

Importante

Per qualsiasi processo in esecuzione in AppContainer, se si fa in modo che DeploymentManager.Initialize venga chiamato, l'app deve dichiarare la packageManagementfunzionalità con restrizioni nel manifesto del pacchetto. Per altri dettagli, vedere Inizializzatore automatico di Deployment Manager.

L'argomento AppContainer per le applicazioni legacy illustra tutte le informazioni generali necessarie su ciò che l'ambiente AppContainer è e i relativi vantaggi; Questo argomento contiene anche esempi di codice C# e C++ per verificare se un processo è in esecuzione all'interno di un AppContainer.

L'argomento che si sta leggendo illustra come è possibile acquisire un'app in pacchetto usando MSIX e configurarla facilmente per l'esecuzione nell'ambiente AppContainer (in un contenitore di app leggero). Le applicazioni della Piattaforma UWP (Universal Windows Platform) sono automaticamente applicazioni AppContainer. Ma puoi anche configurare l'app desktop in pacchetto con MSIX come app AppContainer.

Il processo di un'app AppContainer e i relativi processi figlio vengono eseguiti all'interno di un contenitore di app leggero in cui possono accedere solo alle risorse concesse in modo specifico. E sono isolati mediante la virtualizzazione del file system e del Registro di sistema. Di conseguenza, le app implementate in un AppContainer non possono essere compromesse per consentire azioni dannose al di fuori delle risorse assegnate limitate.

Suggerimento

Anche le app senza pacchetti possono essere eseguite in un AppContainer. Ma è particolarmente facile usare AppContainer se si utilizza MSIX. Di conseguenza, tutti gli scenari descritti in questo argomento riguardano le app in pacchetto.

Configurare un progetto WinUI 3 per AppContainer

I passaggi descritti in Creare un nuovo progetto per un'app desktop C# o C++ WinUI 3 in pacchetto mostrano il modo predefinito e consigliato per creare un nuovo progetto WinUI 3.

Per impostazione predefinita, il file del Package.appxmanifest progetto contiene la configurazione per un pacchetto di attendibilità totale ( ovvero livello di integrità medio). Le sezioni pertinenti hanno un aspetto simile al seguente:

...
<Applications>
  <Application ...
    EntryPoint="$targetentrypoint$">
    ...
  </Application>
</Applications>

<Capabilities>
  <rescap:Capability Name="runFullTrust" />
</Capabilities>
...

Per configurare il pacchetto come contenente un'app AppContainer, è possibile modificare l'attributo EntryPoint e rimuovere la dichiarazione di funzionalità con restrizioni (ma mantenere l'elemento Capabilities ). nel modo seguente:

...
<Applications>
  <Application ...
    EntryPoint="windows.partialTrustApplication">
    ...
  </Application>
</Applications>

<Capabilities/>
...

Se il pacchetto viene installato in Windows 10 versione 2004 (10.0; Build 19041) e/o versione successiva, invece di impostare EntryPoint, è possibile impostare uap10:TrustLevel e uap10:RuntimeBehavior (dopo aver dichiarato il prefisso dello spazio dei nomi XML, come illustrato). nel modo seguente:

<Package ...
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  ...>
...
  <Applications>
    <Application ...
      EntryPoint="$targetentrypoint$"
      uap10:TrustLevel="appContainer"
      uap10:RuntimeBehavior="packagedClassicApp">
      ...
    </Application>
  </Applications>

  <Capabilities/>
...

Per altre info, vedi questi argomenti:

Configurare una soluzione a due progetti WinUI 3 per AppContainer

La sezione precedente ha descritto il processo per MSIX a progetto singolo; che è consigliabile e qual è l'impostazione predefinita per i nuovi progetti WinUI 3. Per ulteriori informazioni, consulta Creare un pacchetto dell'app usando MSIX a progetto singolo.

Ma potresti avere un progetto WinUI 3 che risale a prima dell'introduzione della funzionalità MSIX a progetto singolo. In questo caso, nella soluzione saranno presenti due progetti: il progetto dell'app, oltre a un ulteriore Progetto di Confezionamento delle Applicazioni Windows. Se è possibile eseguire la migrazione del progetto a MSIX a progetto singolo, questo è l'ideale. Sarà anche possibile seguire le indicazioni riportate nella sezione precedente. Per ulteriori informazioni, consulta Creare un pacchetto dell'app usando MSIX a progetto singolo.

Se non è possibile eseguire la migrazione del progetto a MSIX a progetto singolo, questa sezione descrive come configurare il pacchetto come contenente un'app AppContainer.

Un progetto di pacchettizzazione delle applicazioni Windows implica un'impostazione predefinita che sostituisce la configurazione in Package.appxmanifest. Il progetto si comporta come se fosse presente una proprietà TrustLevel nel file di progetto impostata su un valore Full.

Per risolvere il valore della proprietà implicita, espandere il nodo Dipendenze>Applicazioni del progetto di creazione del pacchetto e selezionare il nodo che rappresenta il riferimento al progetto WinUI 3. Nella finestra di Visual Studio Properties (non delle proprietà del progetto) per la proprietà Trust Level selezionare il valore della proprietà Partial Trust.

Il file di progetto per il progetto di creazione del pacchetto contiene ora questa proprietà esplicita:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

È ora possibile rimuovere <rescap:Capability Name="runFullTrust" /> dal file Package.appxmanifest del progetto di packaging.

Configurare un progetto di applicazione Windows (app WndProc di Win32 C++) per AppContainer

Questa sezione è utile se si dispone di un progetto di tipo Win32 WndProc C++ creato con il modello di progetto Windows Application Project. Il primo passaggio, in breve, consiste nell'aggiungere alla soluzione un progetto di Windows Application Packaging C++. Sono disponibili altri dettagli sui passaggi esatti descritti in Impostare l'applicazione desktop per la creazione di pacchetti MSIX in Visual Studio. Questo argomento si applica alle app desktop scritte in C++ o C#.

Aprire quindi il file di progetto del nuovo progetto di creazione del pacchetto e aggiungere una proprietà TrustLevel alla proprietà ProjectReference esistente come segue:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

Quando si compila, potrebbe essere visualizzato l'errore "errore APPX1673: Il manifesto dell'app manca dell'elemento richiesto 'PhoneIdentity'". In tal caso, modificare il file del Package.appxmanifest progetto come segue:

<Package ...
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  ...>
...
  <mp:PhoneIdentity
      PhoneProductId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx."
      PhonePublisherId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.">
  </mp:PhoneIdentity>
...

Configurare un progetto macchine virtuali Windows o WinForms per AppContainer

Questa sezione è disponibile se si dispone di uno dei due elementi seguenti:

  • un progetto di app Windows Presentation Foundation (macchine virtuali Windows) creato con il modello di progetto C# macchine virtuali Windows Application. Verrà visualizzato un progetto di .NET ed è diverso dal modello di progetto denominato macchine virtuali Windows App (.NET Framework). oppure
  • un progetto di app Windows Forms (WinForms) creato con il modello di progetto C# Windows Forms App. Verrà visualizzato un progetto di .NET ed è diverso dal modello di progetto denominato Windows Forms App (.NET Framework).

Il primo passaggio, in breve, consiste nell'aggiungere alla soluzione un progetto di creazione di pacchetti di applicazioni Windows in C#. Sono disponibili altri dettagli sui passaggi esatti descritti in Impostare l'applicazione desktop per la creazione di pacchetti MSIX in Visual Studio.

Quindi espandere il nodo Dependencies>Applications e selezionare il nodo che rappresenta il riferimento al progetto macchine virtuali Windows o WinForms. Nella finestra di Visual Studio Properties (non delle proprietà del progetto) per la proprietà Trust Level selezionare il valore della proprietà Partial Trust.