Condividi tramite


Usare il SDK per app di Windows in un'app macchine virtuali Windows

La SDK per app di Windows è la prossima evoluzione nella piattaforma di sviluppo di app Windows. Questo argomento illustra tuttavia come usare api SDK per app di Windows (e API Windows Runtime) in un'app Windows Presentation Foundation (macchine virtuali Windows)!

  • In molti casi, è consigliabile ricreare l'app macchine virtuali Windows sotto forma di app WinUI 3. Solo uno dei vantaggi del passaggio a WinUI consiste nell'avere accesso al Fluent Design System (vedere anche Design e code Windows apps). E WinUI fa parte del SDK per app di Windows, quindi, naturalmente, un'app WinUI può usare anche le altre funzionalità e API SDK per app di Windows. Questo argomento non illustra il processo di migrazione dell'app macchine virtuali Windows a WinUI.
  • Tuttavia, se trovi che usi funzionalità di macchine virtuali Windows che non sono ancora disponibili in WinUI, puoi comunque usare le funzionalità di SDK per app di Windows (ad esempio Ciclo di vita dell'app, MRT Core, DWriteCore e altri) nella tua app macchine virtuali Windows. Questo argomento spiega come fare.

Nel caso in cui non si abbia già un progetto di macchine virtuali Windows esistente o si vuole praticare il processo, questo argomento include i passaggi per creare un progetto macchine virtuali Windows in modo da poterlo seguire e configurarlo per chiamare le API di SDK per app di Windows.

Prerequisiti

  1. Installare gli strumenti per il SDK per app di Windows.
  2. Questo argomento illustra sia le app non in pacchetto che le app macchine virtuali Windows in pacchetto. Se l'app macchine virtuali Windows è non impacchettata (che le app macchine virtuali Windows lo sono per impostazione predefinita), assicurarsi che tutte le dipendenze per le app non impacchettate siano installate (vedere la guida alla distribuzione SDK per app di Windows per le app dipendenti dal framework impacchettate con percorso esterno o non impacchettate). Un modo rapido per farlo è visitare Latest download per il SDK per app di Windows, quindi scaricare ed decomprimere ed eseguire una delle versioni stabili Runtime downloads.

Importante

La versione del Runtime installata deve corrispondere alla versione del Microsoft. WindowsAppSDK pacchetto NuGet che verrà installato in un passaggio successivo.

Per maggiori informazioni sui termini Non inclusi nel pacchetto e inclusi nel pacchetto, vedere Vantaggi e svantaggi della creazione di pacchetti per l'app.

Creare un progetto macchine virtuali Windows se non ne è già disponibile uno

Se si dispone già di un progetto macchine virtuali Windows, è possibile passare alla sezione successiva.

  1. In Visual Studio creare un nuovo progetto C# macchine virtuali Windows Application (ovvero un progetto di .NET). Prestare attenzione a scegliere il modello di progetto con il nome esatto macchine virtuali Windows Application e non macchine virtuali Windows App (.NET Framework).
  2. Assegnare al project un nome e accettare tutte le opzioni predefinite.

Ora hai un progetto che crea un'app macchine virtuali Windows non confezionata.

Configurare il progetto di macchine virtuali Windows per il supporto di SDK per app di Windows

Prima di tutto si modificherà il file project.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul project e scegliere Edit Project File.

  2. Questo passaggio consente di chiamare api Windows Runtime (WinRT) (incluse SDK per app di Windows API). All'interno dell'elemento PropertyGroup è presente l'elemento TargetFramework, che viene impostato su un valore come net6.0. Aggiungere a tale valore del framework di destinazione un moniker (in particolare, un Moniker del Framework di Destinazione). Ad esempio, usare quanto segue se l'app è destinata a Windows 10 versione 2004:

    <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
    
  3. Inoltre, all'interno dell'elemento PropertyGroup aggiungere un elemento RuntimeIdentifiers, come illustrato di seguito. Se la destinazione è .NET 8 o versione successiva, usare invece il valore win-x86;win-x64;win-arm64.

    <RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
    
  4. Per impostazione predefinita, un'app di macchine virtuali Windows è unpackaged (ovvero non è installata tramite MSIX). Un'app non in pacchetto deve inizializzare il runtime di SDK per app di Windows prima di usare qualsiasi altra funzionalità del SDK per app di Windows. È possibile farlo automaticamente all'avvio dell'app tramite Inizializzazione automatica. È sufficiente impostare (anche all'interno dell'elemento PropertyGroup) la proprietà WindowsPackageType project in modo appropriato, come illustrato di seguito:

    <WindowsPackageType>None</WindowsPackageType>
    

    Se sono necessarie esigenze avanzate (ad esempio la gestione degli errori personalizzata o per caricare una versione specifica del SDK per app di Windows), invece di l'auto-inizializzazione è possibile chiamare l'API del bootstrapper in modo esplicito; per ulteriori informazioni, consultare Use the SDK per app di Windows runtime for apps packaged with external location or unpackaged.

  5. Salvare e chiudere il file project.

Verrà quindi installato il pacchetto NuGet SDK per app di Windows nel progetto.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo Dependencies del progetto e scegliere Gestisci pacchetti NuGet... .
  2. Nella finestra NuGet Gestione pacchetti selezionare la scheda Sfoglia e installare il pacchetto Ultima versione stabileMicrosoft.WindowsAppSDK.

Usare alcune funzionalità di SDK per app di Windows nell'app macchine virtuali Windows

Questa sezione offre un esempio molto semplice di chiamata SDK per app di Windows API da un'app macchine virtuali Windows. Usa la funzionalità MRT Core (vedere Gestire le risorse con MRT Core). Se questo esempio funziona per il progetto macchine virtuali Windows (e se ne è stato creato uno nuovo per questa procedura dettagliata, sarà possibile seguire questa procedura).

  1. Aggiungere il markup seguente a MainWindow.xaml (potresti incollarlo all'interno della radice Grid):

    <StackPanel>
        <Button HorizontalAlignment="Center" Click="Button_Click">Click me!</Button>
        <TextBlock HorizontalAlignment="Center" x:Name="myTextBlock">Hello, World!</TextBlock>
    </StackPanel>
    
  2. A questo punto verrà aggiunto codice che usa la classe ResourceManager nella SDK per app di Windows per caricare una risorsa stringa.

    1. Aggiungere un nuovo elemento Resources File (.resw) al project (lasciare il nome predefinito di Resources.resw).

    2. Con il file di risorse aperto nell'editor, creare una nuova risorsa di stringa con le proprietà seguenti.

      • Nome: Messaggio
      • Valore: Hello, resources!
    3. Salvare e chiudere il file di risorse.

    4. In MainWindow.xaml.cs, aggiungere il seguente gestore eventi:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Construct a resource manager using the resource index generated during build.
        var manager = 
          new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
    
        // Look up a string in the resources file using the string's name.
        myTextBlock.Text = manager.MainResourceMap.GetValue("Resources/Message").ValueAsString;
    }
    
  3. Compilare il project ed eseguire l'app. Fare clic sul pulsante per visualizzare la stringa Hello, resources! visualizzata.

Suggerimento

Se in fase di esecuzione viene visualizzata una finestra di messaggio che indica che l'applicazione richiede una versione specifica del runtime di app di Windows e chiede se si vuole installarla ora, fare clic su Yes. Ti porterà a Ultimi download per il SDK per app di Windows. Per altre informazioni, vedere la sezione Prerequisiti di cui sopra.

Vedi anche Architettura runtime per altre informazioni sulla dipendenza del pacchetto del Framework che la tua app richiede quando utilizza il SDK per app di Windows, e sui componenti aggiuntivi necessari per funzionare in un'app senza pacchetto.

Impacchetta e distribuisci la tua app macchine virtuali Windows con MSIX

Alcune funzionalità e API Windows (incluse le API SDK per app di Windows notifications) richiedono che l'app abbia package identity in fase di esecuzione (in altre parole, l'app deve essere packaged). Per altre informazioni, vedere Funzionalità che richiedono l'identità del pacchetto.

  1. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sulla soluzione e scegliere Aggiungi>Nuovo Project... .
  2. Nella finestra di dialogo Aggiungi una nuova finestra di dialogo project cercare packaging, scegliere il modello C# Windows Application Packaging Project project e fare clic su Next.
  3. Assegnare al project il nome e fare clic su Crea.
  4. L'intento è di specificare quali applicazioni nella soluzione devono essere incluse nel pacchetto. Quindi nel progetto di creazione del pacchetto (non il progetto macchine virtuali Windows), fare clic con il tasto destro sul nodo Dependencies e selezionare Aggiungi riferimento al progetto....
  5. Nell'elenco dei progetti nella soluzione scegliere il progetto macchine virtuali Windows e fare clic su OK.
  6. Espandi il nodo Dependencies>Applications e verifica che il progetto macchine virtuali Windows sia referenziato e visualizzato in grassetto. Questo significa che verrà usato come punto di partenza per il pacchetto.
  7. Fare clic destro sul progetto di packaging e scegliere Set As Startup Project.
  8. Fare clic con il pulsante destro del mouse sul macchine virtuali Windows project e scegliere Edit Project File.
  9. Eliminare <WindowsPackageType>None</WindowsPackageType>, salvare e chiudere.
  10. Nell'elenco a discesa Piattaforme di soluzioni selezionare x64 (invece di Qualsiasi CPU).
  11. Verificare che sia possibile compilare ed eseguire.

Dopo aver creato un pacchetto dell'app macchine virtuali Windows, è possibile chiamare le API che richiedono l'identità del pacchetto. Quindi, in MainWindow.xaml.cs, modificare il gestore eventi in modo che sia simile al seguente:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var notification = new AppNotificationBuilder()
        .AddArgument("action", "viewConversation")
        .AddArgument("conversationId", "9813")
        .AddText("Andrew sent you a picture")
        .AddText("Check this out, The Enchantments in Washington!")
        .BuildNotification();

    AppNotificationManager.Default.Show(notification);
}

Compilare ed eseguire di nuovo. Fare clic sul pulsante e confermare che venga visualizzata una notifica toast. Quando viene chiamato da un processo che non dispone dell'identità del pacchetto in fase di esecuzione, le API di notifica generano un'eccezione.

Nota

I passaggi descritti in questa sezione illustrano come creare un' app inclusa nel pacchetto. Un'alternativa consiste nel creare una app inclusa nel pacchetto con posizione esterna. Per un promemoria di tutte queste condizioni, vedere Vantaggi e svantaggi della creazione di pacchetti dell'app.

Eseguire il codice in background

Per applicazioni macchine virtuali Windows che devono eseguire codice quando l'app non è in esecuzione, sono disponibili tre approcci a seconda della modalità di packaging e della tipologia di carico di lavoro:

Avvicinarsi Imballaggio necessario Ideale per
Le attività in background di SDK per app di Windows Sì (MSIX) Trigger gestiti dal sistema a risparmio energetico (tempo/sistema)
Utilità di pianificazione No Sincronizzazione periodica, app non in pacchetto
.NET Worker Services No Carichi di lavoro a esecuzione prolungata senza interfaccia, in qualsiasi modello di distribuzione

Per le attività in background di SDK per app di Windows, l'app macchine virtuali Windows registra un componente COM usando BackgroundTaskBuilder proprio come un'app WinUI 3, mentre l'evento Application.Startup in macchine virtuali Windows mappa al ruolo di App.OnLaunched in WinUI 3. Per la procedura dettagliata completa, vedere Utilizza le attività in background nelle app Windows.

Nota

SDK per app di Windows: le attività in background richiedono il packaging MSIX. Per le app di macchine virtuali Windows non in pacchetto, usare invece Utilità di pianificazione o servizi di lavoro .NET.