← Wszystkie wpisy

Instalacja .NET SDK i pierwszy program, krok po kroku

Instalator to kilka minut i jedno kliknięcie. Czas znika dopiero przy sprawdzaniu, czy na pewno działa ta wersja, o której myślisz.

Artur Kot 8 min czytania

Na końcu mają działać dwa polecenia. dotnet --info odpowiada numerem wersji, a dotnet run uruchamia program, który wypisuje tekst w konsoli. Instalacja .NET SDK sprowadza się do pobrania jednego pliku i uruchomienia go. Kłopoty zaczynają się krok później.

Krok 0: sprawdź, czy nie masz już SDK

Zanim cokolwiek pobierzesz, otwórz PowerShell i wpisz:

dotnet --list-sdks

Jeśli zobaczysz linię z numerem i ścieżką, SDK jest już zainstalowane:

10.0.400 [C:\Program Files\dotnet\sdk]

Wtedy instalator jest zbędny. Visual Studio, Rider i część narzędzi instalują SDK przy okazji, więc ta linia pojawia się częściej, niż wynikałoby z pamięci o tym, co się instalowało na tej maszynie przez ostatni rok. Puste wyjście albo komunikat o nieznanym poleceniu znaczy, że idziesz dalej.

Warto zrobić ten jeden krok, bo druga instalacja obok istniejącej nie kończy się błędem. Kończy się dwiema wersjami, z których jedna jest pierwsza w PATH, i tygodniem zastanawiania się, dlaczego edytor widzi coś innego niż terminal.

Instalator i weryfikacja

Instalator dla Windows x64 pobierzesz ze strony .NET. Plik ma około 200 MB i po uruchomieniu nie zadaje żadnych pytań poza zgodą na instalację. Nie ma tu nic do wybrania, żadnych komponentów opcjonalnych ani katalogu docelowego. DevJourney wymaga wersji 10, tej samej, którą pobiera domyślny przycisk na tej stronie.

Po instalacji zamknij terminal i otwórz nowy. Potem:

dotnet --info

Odpowiedź jest długa i to jest jej zaleta. Zawiera wszystko, o co trzeba by pytać osobno, a przy zgłaszaniu problemu na forum jest pierwszą rzeczą, o którą poprosi każdy, kto zamierza pomóc.

Trzy różne numery w jednej odpowiedzi

Ta sama odpowiedź podaje kilka wersji i one nie są tym samym numerem zapisanym w kilku miejscach:

.NET SDK:
 Version:           10.0.400
 Commit:            14fbf8d527
 MSBuild version:   18.9.6+14fbf8d52

Runtime Environment:
 RID:         win-x64
 Base Path:   C:\Program Files\dotnet\sdk\10.0.400\

Host:
  Version:      10.0.11
  Architecture: x64

Numery przy SDK i przy Host różnią się i tak ma być. Pierwszy opisuje narzędzia, którymi kompilujesz, drugi środowisko uruchomieniowe, które wykonuje gotowy program. SDK aktualizuje się częściej, bo zmiany w kompilatorze i w szablonach nie wymagają ruszania tego, co uruchamia skompilowany kod.

Osobne polecenie pokazuje, ile środowisk stoi obok siebie:

dotnet --list-runtimes

Na tej maszynie wypisuje między innymi to:

Microsoft.NETCore.App 9.0.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 10.0.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

Dwie linie tej samej rodziny, jedna z dziewiątki i jedna z dziesiątki. Starsza została po poprzednim SDK i jest potrzebna, bo program zbudowany na dziewiątkę nadal jej szuka przy uruchomieniu. Do tej listy wracasz wtedy, gdy program uruchamia się u Ciebie, a u kogoś innego nie. Usuwanie starych środowisk niczego nie przyspiesza. Zajmują miejsce na dysku i tyle.

Niżej dotnet --info potrafi wypisać jeszcze coś takiego:

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]

To druga, osobna instalacja, w innej architekturze, zwykle zostawiona przez jakiś instalator. Nie przeszkadza, dopóki where dotnet wskazuje katalog bez (x86) w nazwie. Jeśli wskazuje ten z (x86), kolejność wpisów w PATH jest odwrotna, niż powinna być, i to jest moment na jej poprawienie.

Pierwszy program w dwóch poleceniach

Szablon konsolowy tworzy się jednym poleceniem:

dotnet new console -o witaj
cd witaj
dotnet run

Pierwsze z nich wypisuje po polsku, jeśli język interfejsu systemu jest polski:

Pomyślnie utworzono szablon "Aplikacja konsoli".

Trwa przetwarzanie akcji po utworzeniu...
Przywracanie pakietu C:\...\witaj\witaj.csproj:
  Trwa określanie projektów do przywrócenia...
  Przywrócono element C:\...\witaj\witaj.csproj (w 92 ms).
Przywracanie powiodło się.

Ostatnie dwie linie tego wyjścia znaczą, że przywracanie pakietów już się odbyło. Osobne dotnet restore jest więc niepotrzebne, choć połowa poradników każe je uruchomić zaraz po utworzeniu projektu.

Powstają dwa pliki. witaj.csproj opisuje projekt, a Program.cs zawiera kod, i na starcie jest to jedna linia:

Console.WriteLine("Hello, World!");

Nie ma tu klasy, metody Main ani żadnej deklaracji wokół. Kompilator dopisuje je sam przy budowaniu, a plik zostaje przy jednej instrukcji. Starsze kursy pokazują w tym miejscu kilkanaście linii i to nie jest błąd w nich, tylko poprzednia konwencja szablonu.

Katalog obj, który pojawia się obok, jest wynikiem przywracania pakietów i nie jest częścią Twojego kodu. W witaj.csproj liczy się jeden wiersz:

<TargetFramework>net10.0</TargetFramework>

To on decyduje, na której wersji platformy program zostanie zbudowany, i to jego zmienia się przy przenoszeniu projektu na inną wersję. Numer w tym wierszu nie musi być zgodny z numerem SDK. Zgodny musi być z którymś ze środowisk z listy dotnet --list-runtimes.

Pierwsze dotnet run na czystej maszynie zajęło 6,5 sekundy. Drugie, bez zmian w kodzie, 2,5 sekundy. Różnica to kompilacja, która przy pierwszym uruchomieniu wykonuje się w całości, a potem odpada aż do następnej zmiany w pliku. Jeśli więc pierwsze uruchomienie wygląda na zawieszone, jeszcze nie jest.

Przy zupełnie pierwszym poleceniu dotnet na nowym systemie dochodzi jeszcze jedno. Wypisuje się powitanie z numerem wersji, informacja o zbieranej telemetrii i linia o certyfikacie:

Installed an ASP.NET Core HTTPS development certificate.
To trust the certificate, run 'dotnet dev-certs https --trust'

Certyfikat przyda się dopiero przy aplikacjach webowych, przy pierwszym adresie otwieranym po https. Zobaczysz to raz.

Kiedy „dotnet” nie jest rozpoznawane

Najczęstszy problem po poprawnej instalacji wygląda tak:

'dotnet' is not recognized as an internal or external command,
operable program or batch file.

W PowerShellu ten sam brak brzmi inaczej:

The term 'dotnet' is not recognized as the name of a cmdlet, function, script
file, or operable program.

Komunikat pochodzi z powłoki, nie z .NET, więc pojawia się w języku interfejsu systemu. Na polskim Windowsie zaczyna się od słów o nierozpoznanym poleceniu wewnętrznym lub zewnętrznym. Treść jest ta sama.

Przyczyna prawie zawsze jest jedna. Instalator dopisał C:\Program Files\dotnet\ do zmiennej PATH, ale terminal otwarty wcześniej wczytał starą zawartość tej zmiennej w chwili startu i nic go nie zmusi do ponownego odczytu. Zamknij okno i otwórz nowe. Sprawdzisz to poleceniem:

where dotnet

Poprawna odpowiedź to C:\Program Files\dotnet\dotnet.exe. Brak odpowiedzi po restarcie terminala znaczy, że instalator nie dokończył pracy i warto uruchomić go ponownie. Restart całego systemu bywa zalecany w odpowiedziach na forach i prawie nigdy nie jest potrzebny.

Projekt żąda wersji, której nie masz

Drugi błąd jest ciekawszy, bo pojawia się dopiero w konkretnym katalogu. To samo polecenie działa piętro wyżej i przestaje działać po wejściu do projektu:

  * You intended to execute a .NET SDK command:
      A compatible .NET SDK was not found.

Requested SDK version: 9.0.100
global.json file: C:\...\global.json

Installed SDKs:
10.0.400 [C:\Program Files\dotnet\sdk]

Install the [9.0.100] .NET SDK or update global.json to match an installed SDK.

Winny jest plik global.json, który przypina projekt do wskazanej wersji SDK. Repozytoria z kursów i firmowe szablony noszą go często, a że leży w katalogu głównym projektu i ma kilka linii, łatwo go przeoczyć przy pobieraniu cudzego kodu. Masz dwa wyjścia: doinstalować żądaną wersję albo podnieść numer w pliku do tego, co pokazuje dotnet --list-sdks. Wiele wersji SDK stoi obok siebie bez konfliktu, więc pierwsze wyjście nie psuje niczego, co już działa.

Ten komunikat wypisuje host, a nie interfejs wiersza poleceń, więc zostaje angielski nawet przy polskim systemie. Zmienna DOTNET_CLI_UI_LANGUAGE na niego nie działa i szukanie polskiej wersji tego tekstu nie ma sensu.

Instalacja .NET SDK kończy się w chwili, w której dotnet --info i dotnet run odpowiadają tym, czego się spodziewasz. Następny komunikat będzie już od kompilatora, a najczęstszy z nich to CS0029 przy przypisaniu typów.

DevJourney uruchamia te same polecenia wewnątrz aplikacji, na prawdziwym dotnet, bez konfigurowania czegokolwiek osobno.

Tematy: dotnetnarzedziapodstawy

Pobieranie ruszyło

DevJourney_1.0.0_x64-setup.exe · 1.0.0

Jeśli Windows ostrzeże

Komunikat „System Windows ochronił Twój komputer” nie oznacza wykrycia wirusa. SmartScreen ufa certyfikatowi, którym podpisany jest instalator, a ten jeszcze zbiera reputację poprzez licznik pobrań.

W oknie ostrzeżenia: Więcej informacji → Uruchom mimo to.

Sprawdź to sam

Zobacz wynik skanowania w VirusTotal

Albo w PowerShellu, w katalogu z pobranym plikiem:

Get-FileHash .\DevJourney_1.0.0_x64-setup.exe

Powinno wypisać:

7cd001be4463317f601b8bb2eed78537982a3559c92f06e96288434c79931fd6