Visual Studio Code posiada mechanizm debugowania aplikacji. Domyślna konfiguracja umożliwia debugowanie aplikacji dotnet Core lub javascript z wykorzystaniem node.js. Dla poczciwego starego .Net kwestia debugowania nie jest już tak klarowna. Wymaga wprowadzenia kilku modyfikacji w pliku csproj aplikacji.
Pierwszym warunkiem, aby uruchomić debuger aplikacji Windows Forms należy zainstalować rozszerzenie C# w Visual Studio Code.
Kolejnym krokiem jest utworzenie konfiguracji debugera. W katalogu .vscode tworzymy plik launch.json z poniższą zawartością:
{ "version": "0.2.0", "configurations": [ { "name": ".NET Attach", "type": "clr", "request": "attach", "processId": "${command:pickProcess}" },{ "name": ".NET Launch", "type": "clr", "request": "launch", "program": "${workspaceRoot}/bin/Debug/WindowsFormsApp.exe", "args": [], "cwd": "${workspaceRoot}", "stopAtEntry": false } ] }
Można również wykonać tą czynność z poziomu zakładki Debug (Ctrl +Shift + D) klikając w ustawienia, wybierając np. konfiguracje .net Core , a następnie podmienić zawartość pliku launch.json.
Dalej przechodzimy do plików aplikacji by ustawić breakpoint w miejscu, w którym chcemy zatrzymać aplikacje. W zakładce Debug (Ctrl +Shift + D) uruchamiamy .NET Attach. Możemy się teraz podłączyć do naszej aplikacji Windows Forms wpisując jej nazwę lub id procesu.
Podłączyliśmy się do procesu aplikacji Windows Forms jednak debuger nadal nie chce współpracować, program nie zatrzymuje się w wyznaczonym miejscu, breakpoint jest wyszarzany.
Dzieje się tak ponieważ Visual Studio Code potrzebuje trochę inaczej zbudowanych plików pdb. Może zwróciłeś uwagę na komunikat:
WARNING: Could not load symbols for 'WindowsFormsApp.exe’. '…\WindowsFormsApp\bin\Debug\WindowsFormsApp.pdb’ is a Windows PDB. These are not supported by the cross-platform .NET Core debugger.
Rozwiązaniem tego problem jest wstawienie wartości portable w sekcji PropertyGroup w DebugType dla konfiguracji debug. Proponuje jeszcze dodać jedną modyfikacje. Visual studio Code preferuje 64bitowe aplikacje, dlatego warto dodać wpis <Prefer32Bit>false</Prefer32Bit> pod koniec sekcji PropertyGroup.
Po ponownym zbudowaniu aplikacji i uruchomieniu debugowania, aplikacja w końcu powinna zatrzymać się w wyznaczonym miejscu breakpoint’a.