Uso di Visual Studio Code per il debug di cmdlet compilati

Questa guida illustra come eseguire il debug interattivo di codice sorgente C# per un modulo di PowerShell compilato usando Visual Studio Code (VS Code) e l'estensione C#.

Si presuppone una certa familiarità con il debugger di Visual Studio Code.

In questa guida si presuppone che siano state lette e seguite le istruzioni riportate nella guida Scrittura di moduli portabili.

Creazione di un'attività di compilazione

Compilare automaticamente il progetto prima di avviare una sessione di debug. La ricompilazione consente di assicurarsi di eseguire il debug della versione più recente del codice.

Configurare un'attività di compilazione:

  1. Nel riquadro comandi eseguire il comando Configure Default Build Task (Configura attività di compilazione predefinita).

    Eseguire l'attività di compilazione predefinita

  2. Nella finestra di dialogo Select a task to configure (Seleziona un'attività da configurare) scegliere Create tasks.json file from template (Crea file tasks.json da modello).

  3. Nella finestra di dialogo Select a Task Template (Seleziona modello di attività) scegliere .NET Core.

Viene creato un nuovo file tasks.json se non ne esiste già uno.

Per testare l'attività di compilazione:

  1. Nel riquadro comandi eseguire il comando Esegui attività di compilazione.

  2. Nella finestra di dialogo Select the build task to run (Seleziona attività di compilazione da eseguire) scegliere build (compilazione).

Informazioni sui file DLL bloccati

Per impostazione predefinita, una compilazione riuscita non visualizza l'output nel riquadro del terminale. Se viene visualizzato output contenente il testo Project file doesn't exist (Il file di progetto non esiste), è necessario modificare il file tasks.json. Includere il percorso esplicito del progetto C# espresso come "${workspaceFolder}/myModule". In questo esempio, myModule è il nome della cartella del progetto. Questa voce deve seguire la voce build nell'elenco args come indicato di seguito:

    {
        "label": "build",
        "command": "dotnet",
        "type": "shell",
        "args": [
            "build",
            "${workspaceFolder}/myModule",
            // Ask dotnet build to generate full paths for file names.
            "/property:GenerateFullPaths=true",
            // Do not generate summary otherwise it leads to duplicate errors in Problems panel
            "/consoleloggerparameters:NoSummary",
        ],
        "group": "build",
        "presentation": {
            "reveal": "silent"
        },
        "problemMatcher": "$msCompile"
    }

Quando si esegue il debug, la DLL del modulo viene importata nella sessione di PowerShell nel terminale di VS Code. La DLL viene bloccata. Quando si esegue l'attività di compilazione senza chiudere la sessione del terminale, viene visualizzato il messaggio seguente:

Could not copy "obj\Debug\netstandard2.0\myModule.dll" to "bin\Debug\netstandard2.0\myModule.dll"`.

Prima di eseguire la ricompilazione, è necessario chiudere le sessioni del terminale.

Configurazione del debugger

Per eseguire il debug del cmdlet di PowerShell, è necessario impostare una configurazione di avvio personalizzata. Questa configurazione viene usata per:

  • Compilare il codice sorgente
  • Avviare PowerShell con il modulo caricato
  • Lasciare aperto PowerShell nel riquadro del terminale

Quando si richiama il cmdlet nella sessione del terminale, il debugger si arresta in corrispondenza di tutti i punti di interruzione impostati nel codice sorgente.

Configurazione di launch.json per PowerShell

  1. Installare l'estensione C# per Visual Studio Code

  2. Nel riquadro Debug aggiungere una configurazione di debug

  3. Nella finestra di dialogo Select environment scegliere .NET Core

  4. Il file launch.json viene aperto nell'editor. Con il cursore all'interno della matrice configurations viene visualizzata la selezione configuration. Se questo elenco non viene visualizzato, selezionare Add Configuration (Aggiungi configurazione).

  5. Per creare una configurazione di debug predefinita, selezionare Launch .NET Core Console App (Avvia app console .NET Core):

    Avviare l'app console .NET Core

  6. Modificare i campi name, program, args e console come indicato di seguito:

     {
         "name": "PowerShell cmdlets: pwsh",
         "type": "coreclr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "pwsh",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

Il campo program viene usato per avviare pwsh in modo che sia possibile eseguire il cmdlet di cui è in corso il debug. L'argomento -NoExit impedisce la chiusura della sessione di PowerShell non appena viene importato il modulo. Il percorso nell'argomento Import-Module è il percorso dell'output di compilazione predefinito usato se è stata seguita la guida Scrittura di moduli portabili. Se è stato creato un manifesto del modulo (file .psd1), è invece consigliabile usare il percorso di tale file. Il separatore di percorso / funziona in Windows, Linux e macOS. Per eseguire i comandi di PowerShell di cui si vuole eseguire il debug, è necessario usare il terminale integrato.

Nota

Se il debugger non si arresta in corrispondenza di alcun punto di interruzione, verificare se è presente la riga seguente nella Console di debug di Visual Studio Code:

Loaded '/path/to/myModule.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

In caso affermativo, aggiungere "justMyCode": false alla configurazione di avvio, allo stesso livello di "console": "integratedTerminal".

Configurazione di launch.json per Windows PowerShell

Questa configurazione di avvio funziona per il test dei cmdlet in Windows PowerShell (powershell.exe). Creare una seconda configurazione di avvio con le modifiche seguenti:

  1. name dovrebbe essere PowerShell cmdlets: powershell

  2. type dovrebbe essere clr

  3. program dovrebbe essere powershell

    La cartella dovrebbe avere un aspetto simile a questo:

     {
         "name": "PowerShell cmdlets: powershell",
         "type": "clr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "powershell",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

Avvio di una sessione di debug

Ora tutto è pronto per iniziare il debug.

È possibile eseguire il codice sorgente un'istruzione alla volta, controllare le variabili ed esaminare lo stack di chiamate.

Per terminare il debug, fare clic su Arresta sulla barra degli strumenti di debug oppure premere MAIUSC+F5. La shell usata per il debug viene chiusa e rilascia il blocco sul file DLL compilato.