Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Molte API di Windows (notifiche push, attività in background, destinazione di condivisione, attività di avvio, API di intelligenza artificiale Windows) richiedono che l'app abbia package identity. Durante lo sviluppo, non vuoi creare un programma di installazione MSIX completo ogni volta che esegui il test. Winapp fornisce due comandi per assegnare all'app l'identità in tempo reale.
Uso di Visual Studio con un progetto di creazione di pacchetti? Se usi già Visual Studio per il progetto in pacchetto, probabilmente non hai bisogno di winapp per il debug. Visual Studio gestisce già la registrazione del pacchetto, l'identità, l'attivazione AUMID, l'allegato del debugger e il debug del codice di attivazione, tutti da F5. Offre anche Debug → Altre Destinazioni di Debug → Debug Pacchetto App Installato per scenari avanzati. I flussi di lavoro seguenti sono più utili per gli utenti di VS Code, i flussi di lavoro basati su terminale e i framework che VS non include in modo nativo (Rust, Flutter, Tauri, Electron, plain C++).
Due approcci: winapp run vs create-debug-identity
winapp run |
create-debug-identity |
|
|---|---|---|
| Cosa registra | Pacchetto di layout libero completo (intera cartella) | Pacchetto ridotto (singolo EXE) |
| Modalità di avvio dell'app | Avviato da winapp (attivazione AUMID o alias di esecuzione) | Avviare l'exe manualmente (riga di comando, IDE e così via) |
| Simula l'installazione di MSIX | Sì , più vicino al comportamento di produzione | No — solo identità sparse |
| I file rimangono sul posto | Copiato in una directory di layout AppX | Sì — exe rimane nel suo percorso originale |
| Ambito di identità | Contenuto dell'intera cartella (exe, DLL, assets) | Singolo eseguibile |
| Debugger-friendly | Collegarsi al PID dopo l'avvio, oppure usare --no-launch e poi avviare tramite alias |
Avvia direttamente dal debugger dell'IDE: l'exe mantiene un'identità indipendentemente dal contesto. |
| Supporto delle app console |
--with-alias mantiene stdin/stdout nel terminale |
Eseguire exe direttamente nel terminale |
| Migliore per | Maggior parte dei framework (.NET, C++, Rust, Flutter, Tauri) | Electron o quando è necessario il controllo completo del debugger IDE (F5) |
Quando usare quale
Impostazione predefinita: winapp run
Usare winapp run per la maggior parte dei flussi di lavoro di sviluppo. Simula un'installazione MSIX reale: l'app ottiene la stessa identità, funzionalità e associazioni di file che avrebbe in produzione.
# Build your app, then:
winapp run .\build\output
Usare create-debug-identity quando:
-
Il file exe è separato dall'output di compilazione — ad esempio, nelle app Electron dove
electron.exesi trova innode_modules/ - È necessario eseguire il debug del codice di avvio e non è possibile collegare un debugger abbastanza velocemente dopo l'avvio dell'AUMID
-
Con alcuni debugger in cui non è possibile avviare con AUMID ed è necessaria l'identità nel processo avviato,
create-debug-identityregistra l'exe in modo che abbia un'identità indipendentemente dal modo in cui viene avviata - Si sta testando il comportamento del pacchetto sparse in modo specifico (AllowExternalContent, TrustedLaunch)
# Register identity for an exe, then launch it however you want:
winapp create-debug-identity .\bin\Debug\myapp.exe
.\bin\Debug\myapp.exe # or F5 in your IDE
Scenari di debug
Scenario A: Procedi semplicemente con l'identità
Il flusso di lavoro più semplice, ovvero compilare, eseguire con identità, operazione completata.
winapp run .\build\Debug
Winapp registra la cartella come pacchetto di layout libero e avvia l'app. Le API che richiedono identità funzionano immediatamente. Ciò riguarda la maggior parte degli scenari di sviluppo e test.
Per le app console che richiedono stdin/stdout nel terminale corrente, aggiungere --with-alias:
winapp run .\build\Debug --with-alias
Scenario B: Collegare un debugger a un'app in esecuzione
Avviare con winapp run, prendere nota del PID, quindi collegare il debugger dell'IDE.
winapp run .\build\Debug
# Output: Process ID: 12345
Quindi nel tuo IDE:
- VS Code: Esegui e debugga → seleziona la configurazione "Allega" (vedi configurazione dell'IDE di seguito)
-
WinDbg:
windbg -p 12345
Limitazione: Si perderà qualsiasi codice eseguito prima di collegarsi. Per il debug di avvio, usare scenario D (
create-debug-identity).
Scenario C: Registrare l'identità, quindi avviare tramite AUMID o alias dall'IDE
Usare --no-launch per registrare il pacchetto, quindi avviare l'app tramite l'AUMID (segnalato da run) o l'alias di esecuzione dall'IDE.
Passaggio 1: Registrare il pacchetto senza avviare:
winapp run .\build\Debug --no-launch
Passaggio 2: Configurare l'IDE per l'avvio tramite l'AUMID o l'alias di esecuzione (non direttamente il file exe).
- Avvio con AUMID: usare il comando
start shell:AppsFolder\<AUMID>.winapp runrestituisce l'AUMID quando l'app viene registrata. - Avvio con l'alias: l'alias deve essere definito nel manifest (
Package.appxmanifestpreferito,appxmanifest.xmlanche supportato).
Importante: Il semplice avvio dell'exe nella cartella build non fornirà un'identità. L'app deve essere avviata tramite l'attivazione AUMID o il relativo alias di esecuzione. Questo è il funzionamento dei pacchetti di layout separati: l'identità è associata al percorso di attivazione, non al file exe.
Scenario D: Avviare dall'IDE con identità (debug di avvio)
Questo è l'approccio migliore per il debug del codice di avvio con controllo IDE completo : il debugger dell'IDE controlla il processo dalla prima istruzione e l'exe ha identità indipendentemente dal modo in cui viene avviata.
winapp create-debug-identity .\build\Debug\myapp.exe
Avviare ora l'exe in qualsiasi modo, dal terminale, da F5 di VS Code, da uno script. L'exe ha un'identità perché Windows ha registrato un pacchetto sparse che punta direttamente ad esso.
Come differisce da
winapp run: Concreate-debug-identity, l'identità è associata all'exe stesso (tramiteAdd-AppxPackage -ExternalLocation). Conwinapp run, l'identità è associata al pacchetto di layout libero. L'app deve essere avviata tramite AUMID o un alias. Ciò rendecreate-debug-identityla scelta migliore quando è necessario l'IDE per avviare ed eseguire direttamente il debug dell'exe.
Questo è anche l'approccio migliore per le app Electron in cui il percorso exe è diverso dalla directory di origine.
Scenario E: Acquisire l'output di debug e la diagnostica degli arresti anomali
Acquisire OutputDebugString i messaggi e le eccezioni first-chance inline. Il disturbo del framework (tracce interne WinUI, COM, DirectX) viene filtrato dalla console in modo che vengano visualizzati solo i messaggi di debug dell'app. Tutto è ancora scritto nel file di log per l'analisi completa.
Se l'app si arresta in modo anomalo, un minidump viene acquisito e analizzato automaticamente:
winapp run .\build\Debug --debug-output
In caso di arresto anomalo, l'output include il tipo di eccezione, il messaggio e la traccia dello stack con numeri di riga e file di origine (risolti dai file PDB nella cartella di output della compilazione). I crash gestiti (.NET) vengono analizzati immediatamente senza bisogno di strumenti esterni. Gli crash nativi (C++/WinRT) visualizzano i nomi dei moduli e gli offset; aggiungere --symbols per scaricare i simboli PDB per i nomi delle funzioni completi:
winapp run .\build\Debug --debug-output --symbols
Importante: In questo modo winapp viene collegato come debugger. Windows consente un solo debugger per processo, quindi non puoi collegare anche Visual Studio, VS Code o WinDbg.
Configurazione dell'IDE
VS Code
L'estensione WinApp VS Code fornisce un tipo di debug personalizzatowinapp che avvia l'app con l'identità del pacchetto e collega il debugger, tutto da una singola pressione F5.
Debug con un solo tocco del tasto F5 con supporto per l'identità
Aggiungere una winapp configurazione di avvio a .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "winapp",
"request": "launch",
"name": "WinApp: Launch and Attach"
}
]
}
Quando si preme F5:
- L'estensione analizza l'area di lavoro per individuare le directory di output di compilazione contenenti
.exefile. - Selezionare la cartella di compilazione da eseguire o impostare
inputFolderper ignorare il prompt. - Avvia l'app tramite
winapp runper conferirgli l'identità del pacchetto. - Una sessione di debug secondaria si collega al processo in esecuzione usando il debugger assegnato.
Una volta collegato il debugger, si ottiene l'esperienza di debug completa di VS Code, ovvero impostare i punti di interruzione facendo clic sulla barra, passando attraverso la riga di codice per riga (F10), eseguire l'istruzione in funzioni (F11), esaminare le variabili nel riquadro Variabili e valutare le espressioni nella console di debug. L'app funziona con l'identità del pacchetto in tutto e per tutto, quindi le API che dipendono dall'identità si comportano esattamente come in produzione.
Importante: Il
winapptipo di debug non compila automaticamente il progetto. Dopo aver apportato modifiche al codice, ricompilare prima di premere F5.
Automatizzare le compilazioni con preLaunchTask
Per evitare di dimenticare di ricompilare, aggiungere un oggetto preLaunchTask che compila il progetto prima di ogni sessione di debug:
- Definire un'attività di compilazione in
.vscode/tasks.json(ad esempio per .NET):{ "version": "2.0.0", "tasks": [ { "label": "build", "command": "dotnet", "type": "process", "args": ["build", "${workspaceFolder}"], "problemMatcher": "$msCompile" } ] } - Farvi riferimento in
launch.json:{ "type": "winapp", "request": "launch", "name": "WinApp: Launch and Attach", "preLaunchTask": "build" }
Proprietà di configurazione
| Proprietà | TIPO | Default | Description |
|---|---|---|---|
inputFolder |
string | Percorso della cartella di output della build contenente i file binari dell'applicazione, ad esempio ${workspaceFolder}/bin/Debug/net8.0-windows10.0.22621. Se non è impostato, verrà richiesto di selezionare una cartella. |
|
manifest |
string | Percorso di un file manifesto AppX (ad esempio, AppxManifest.xml, Package.appxmanifesto appxmanifest.xml). Se non è impostato, il CLI rileva automaticamente dalla cartella di input o dalla directory corrente. |
|
debuggerType |
string | coreclr |
Debugger sottostante da usare (coreclr, cppvsdbgo node). |
workingDirectory |
string | Cartella dell'area di lavoro | Directory di lavoro per l'applicazione. |
args |
string | Argomenti della riga di comando da passare all'applicazione. | |
outputAppxDirectory |
string | Directory di output per il pacchetto di layout libero. L'impostazione predefinita è una AppX cartella all'interno della cartella di input. |
|
port |
Numero | 9229 |
(node solo) Porta utilizzata per il listener di Node.js --inspect e la connessione di attacco. Eseguire l'override quando la porta predefinita è già in uso. |
Debugger supportati
debuggerType |
Language | Estensione richiesta |
|---|---|---|
coreclr (impostazione predefinita) |
C# /.NET | Kit di sviluppo C# |
cppvsdbg |
C/C++ | C/C++ |
node |
Node.js/Electron | Built-in |
Esempio per un progetto C++:
{
"type": "winapp",
"request": "launch",
"name": "WinApp: Launch C++ App",
"debuggerType": "cppvsdbg"
}
Esecuzione del debug all'avvio con Create Debug Identity
Se è necessario eseguire il debug del codice di avvio dalla prima istruzione, l'approccio di collegamento F5 potrebbe perdere il codice iniziale. Usare invece il comando WinApp: Create Debug Identity () dal riquadro comandi (Ctrl+Shift+P) per registrare un pacchetto sparse per il file eseguibile, quindi avviarlo con il debugger standard:
{
"name": "Launch (with identity)",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/bin/Debug/net8.0-windows10.0.22621/myapp.exe"
}
Poiché create-debug-identity registra l'identità nell'exe stesso, l'app ha un'identità indipendentemente dal modo in cui viene avviata, incluso da una configurazione di avvio standard di VS Code.
Connettersi a un processo in esecuzione
Se si preferisce avviare con winapp run dal terminale e quindi collegarsi, usare una configurazione di collegamento standard:
{
"name": "Attach to Process",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
}
Per C++/Rust, usare "type": "cppvsdbg" (MSVC) o "type": "lldb" (LLDB):
{
"name": "Attach (C++)",
"type": "cppvsdbg",
"request": "attach",
"processId": "${command:pickProcess}"
}
Pulizia
Al termine dei test, eseguire WinApp: Deregistrare pacchetto dalla Palette dei comandi per rimuovere i pacchetti di sviluppo caricati lateralmente senza uscire da VS Code.