Uaktualnianie aplikacji Windows Forms do .NET przy użyciu modernizacji GitHub Copilot

W tym artykule opisano uaktualnianie aplikacji klasycznej Windows Forms do .NET przy użyciu agenta modernizacji GitHub Copilot. Agent działa w Twoim edytorze, analizuje projekt i obsługuje trzyetapowy przepływ pracy: analiza, planowanie i realizacja.

W przykładzie użyto przykładu Matching Game, małej aplikacji Windows Forms dla platformy .NET Framework, składającej się z głównego projektu i biblioteki klas.

Prerequisites

Wskazówka

Przed rozpoczęciem upewnij się, że masz kopię zapasową kodu, na przykład w systemie kontroli wersji lub jego kopię.

Otwieranie rozwiązania

Projekty Matching Game są przeznaczone dla platformy .NET Framework 4.5. Po otwarciu rozwiązania program Visual Studio wyświetla monit o zmianę platformy docelowej projektów na obsługiwaną wersję .NET Framework.

  1. Otwórz rozwiązanie MatchingGame w Visual Studio.
  2. Visual Studio wyświetla okno dialogowe Nie zainstalowano platformy docelowej.
  3. Wybierz Zaktualizuj platformę docelową do programu .NET Framework 4.8 (zalecane), a następnie wybierz Kontynuuj.
  4. Otwórz okno Git Changes i zatwierdź zmiany związane ze zmianą elementu docelowego.

Ważne uwagi dotyczące Visual Basic

Agent modernizacji GitHub Copilot nie obsługuje w pełni projektów Visual Basic .NET. Agent zawiera zabezpieczenia zaprojektowane specjalnie po to, aby zapewnić niezawodną aktualizację projektów C#, a te zabezpieczenia zakłócają analizę i uruchamianie projektów VB. Jeśli rozwiązanie zawiera projekty VB, użyj jednej z następujących alternatyw:

  • GitHub Copilot (agent standardowy): użyj zwykłego agent funkcji Copilot — bez agenta modernizacji — aby przeprowadzić uaktualnienie interaktywnie.
  • Asystent uaktualniania: dedykowane narzędzie do migracji z obsługą języka VB.

Wskazówka

Jeśli rozwiązanie zawiera projekty języka C# i VB, nadal możesz użyć agenta modernizacji dla projektów języka C#. Uaktualnij projekty VB oddzielnie przy użyciu jednej z wymienionych alternatyw.

Jeśli używasz standardowego agenta Copilot lub przeprowadzasz aktualizację ręcznie, wykonaj następujące kroki:

  1. Jeśli projekt jest ukierunkowany na nieobsługiwaną wersję .NET Framework, najpierw zmień platformę docelową na .NET Framework 4.8. Visual Studio monituje o wykonanie tej czynności podczas otwierania rozwiązania lub można go zmienić we właściwościach projektu.

  2. Zaktualizuj wszystkie nieaktualne pakiety NuGet do najnowszych zgodnych wersji.

  3. Utwórz nowy projekt Windows Forms VB przy użyciu szablonu Visual Studio lub dotnet new winforms -lang vb. Szablon tworzy plik projektu i ustawienia w stylu SDK, które różnią się od tych w .NET Framework.

  4. .vb Skopiuj pliki źródłowe ze starego folderu projektu do nowego folderu projektu.

  5. Skopiuj wszystkie pliki inne niż kod, od których zależy projekt, na przykład app.configpliki, .settings obrazy, ikony i inne zasoby osadzone.

  6. Otwórz stary plik projektu (lub packages.config) i zanotuj wszystkie odwołania do pakietu NuGet. Dodaj te same pakiety do nowego projektu przy użyciu Menedżer pakietów NuGet lub dotnet add package <name>.

  7. Jeśli projekt odwołuje się do innych projektów w rozwiązaniu, dodaj je ponownie w nowym projekcie.

  8. Spróbuj skompilować rozwiązanie. Nie naprawiaj jeszcze błędów — wynik kompilacji daje Copilot konkretną listę problemów, na podstawie której może pracować.

  9. Zatwierdź bieżący stan w systemie kontroli wersji, aby mieć czysty punkt odniesienia, zanim Copilot wprowadzi zmiany.

  10. Otwórz Copilot Chat usługi GitHub i poproś go o rozwiązanie pozostałych problemów. Przykład:

    Ten projekt Visual Basic Windows Forms został zmigrowany z programu .NET Framework 4.8 do .NET 10. Plik projektu i pliki źródłowe są w miejscu, ale rozwiązanie nie jest kompilowane. Przejrzyj błędy kompilacji i rozwiąż problemy z niezgodnością interfejsu API, brakującymi odwołaniami i wszelkimi problemami z migracją konfiguracji.

  11. Przejrzyj zmiany proponowane przez Copilot, a następnie ponownie skompiluj i przetestuj projekt.

Inicjowanie uaktualnienia

Rozwiązanie Matching Game zawiera aplikację MatchingGame i bibliotekę klas MatchingGame.Logic . Agent sam określa graf zależności projektu, więc rozpocznij aktualizację na poziomie rozwiązania.

  1. W Eksplorator rozwiązań kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Modernizuj.

    Zostanie otwarte okno usługi GitHub Copilot Chat i rozpocznie rozmowę z agentem modernizacji.

  2. Wybierz model z silnymi możliwościami rozumowania i kodowania.

  3. Poinformuj agenta, co chcesz zrobić. Przykład:

    Uaktualnij wszystko do .NET 10.

    Agent zgłasza bieżący stan bazy kodu i co planuje wykonać:

    • Struktura docelowa: wskazuje, że agent uaktualnia projekty do .NET 10.
    • Tryb przepływu: domyślnie jest to ustawienie automatyczne. W przypadku złożonych aplikacji poproś agenta o przełączenie się do trybu z przewodnikiem .
    • Kontrola źródła: wskazuje, że agent tworzy nową gałąź roboczą.

    Agent zapisuje wyniki swojej pracy w repozytorium w lokalizacji .github/upgrades/scenarios/dotnet-version-upgrade/. Jeśli ten folder już istnieje z poprzedniej próby, agent pyta, czy kontynuować, czy rozpocząć od nowa.

  4. Poinformuj agenta start o rozpoczęciu procesu uaktualniania.

Przegląd oceny

Na etapie oceny agent sprawdza strukturę projektu, zależności i wzorce kodu, aby zidentyfikować, co należy zmienić. Zapisuje wyniki do assessment.md w .github/upgrades/scenarios/dotnet-version-upgrade/.

Gdy Copilot zakończy ocenę, przejrzyj wynik konwersacji. Zazwyczaj zaczyna się od czegoś podobnego do następującego:

Assessment Complete

I've analyzed the solution and created a full assessment — see .github/upgrades/scenarios/dotnet-version-upgrade/assessment.md.

Solution summary:
• Target: net48 → net10.0
• Projects: 2
• MatchingGame.Logic (Class Library)
• MatchingGame (Windows Forms)
• Issues: 883 (673 mandatory, 210 potential)
• Affected Technologies: Windows Forms (666), GDI+ / System.Drawing (208), Legacy Configuration System (2)

Key concerns:
• Both projects are legacy-format .csproj files — need conversion to SDK-style
• MatchingGame.csproj has API incompatibilities (binary + source) and an incompatible NuGet package
• WinForms remains supported on .NET 10 (Windows-only TFM)
• No reported security vulnerabilities

Podział oceny

Copilot otwiera .github/upgrades/scenarios/dotnet-version-upgrade/assessment.md plik w edytorze Visual Studio. Przewiń w dół do MatchingGame\MatchingGame.csproj sekcji, aby wyświetlić tabelę problemów:

Technologia Zagadnienia Wartość procentowa Ścieżka migracji
Starszy system konfiguracji 2 0.2% Starszy system konfiguracji oparty na formacie XML (app.config/web.config), który został zastąpiony bardziej elastycznym modelem konfiguracji w .NET Core. Stary system był sztywny i oparty na formacie XML. Przejdź na Microsoft.Extensions.Configuration z użyciem plików JSON i zmiennych środowiskowych; w razie potrzeby użyj pakietu NuGet System.Configuration.ConfigurationManager jako tymczasowego rozwiązania pomostowego.
GDI+ / System.Drawing 208 23.7% Interfejsy API System.Drawing dla grafiki 2D, obrazowania i drukowania, dostępne za pośrednictwem pakietu NuGet System.Drawing.Common. Uwaga: Nie jest to zalecane w przypadku zastosowań serwerowych ze względu na zależności od systemu Windows; w nowym kodzie rozważ alternatywy międzyplatformowe, takie jak SkiaSharp lub ImageSharp.
Windows Forms 621 76.0% Interfejsy API Windows Forms do tworzenia klasycznych aplikacji pulpitu systemu Windows przy użyciu tradycyjnego interfejsu użytkownika opartego na formularzach, dostępne w platformie .NET w systemie Windows. Włącz obsługę Windows Forms: Opcja 1 (zalecana): Ustaw wartość docelową na net10.0-windows; Opcja 2: Dodaj <UseWindowsForms>true</UseWindowsForms>; Opcja 3 (starsza metoda): Użyj zestawu SDK Microsoft.NET.Sdk.WindowsDesktop.

Większość z tych problemów nie jest prawdziwymi problemami. Spójrz na kolumnę „Ścieżka migracji” w wierszu GDI+, w którym wymieniono 208 problemów. Ocena flaguje te interfejsy API, ponieważ są one dostępne w programie .NET Framework, ale nie w .NET. W kolumnie wyjaśniono poprawkę: dodaj pakiet System.Drawing.Common NuGet, aby przywrócić interfejsy API.

Wiersz Windows Forms wymienia 621 problemów z interfejsem API z tego samego powodu. Interfejsy API Windows Forms nie są domyślnie dostępne w .NET, ale można je ponownie udostępnić przez użycie struktury docelowej specyficznej dla systemu Windows, takiej jak net10.0-windows, oraz ustawienie <UseWindowsForms>true</UseWindowsForms> w pliku projektu. Opcja 3 sugeruje nieprawidłową opcję. Starsze wersje platformy .NET wymagały, aby projekt Windows Forms jawnie określał docelowy zestaw SDK Microsoft.NET.Sdk.WindowsDesktop, ale teraz odwołanie do niego jest dodawane automatycznie po ustawieniu <UseWindowsForms>true</UseWindowsForms>.

Wskazówka

Aby dowiedzieć się więcej na temat opcji, poproś Copilot o więcej informacji i kontekstu.

Przejrzyj opcje uaktualniania

Po ocenie agent przedstawia decyzje dotyczące strategii aktualizacji i zapisuje je w upgrade-options.md w .github/upgrades/scenarios/dotnet-version-upgrade/. W przykładzie gry Dopasowywanie agent wybiera następujące opcje:

Aspect Decyzja Powód
Strategia uaktualniania Dolna do góry. Agent uaktualnia element MatchingGame.Logic najpierw, ponieważ element MatchingGame jest od niego zależny, a następnie weryfikuje każdą warstwę przed przejściem dalej.
Podejście projektowe Na miejscu. Oba projekty są migrowane jednocześnie, ponieważ nie korzystają z nich żadne inne projekty platformy .NET Framework.
Nieobsługiwane pakiety Rozwiąż na miejscu. Analiza wykazała, że znaleziono tylko kilka niezgodnych pakietów, więc agent podczas pracy wyszukuje ich zamienniki.
Nieobsługiwana obsługa interfejsu API Napraw bezpośrednio. Większość zmian w interfejsie API Windows Forms i GDI+ dla platformy .NET ma charakter mechaniczny i nie wymaga oddzielnego etapu planowania.
Natywne interfejsy API systemu Windows Pakiet zgodności systemu Windows Aplikacja intensywnie korzysta z Windows Forms i GDI+ i jest z natury przeznaczona wyłącznie dla systemu Windows.
Typy referencyjne obsługujące wartość null Pozostaw wyłączone. Agent traktuje włączenie obsługi typów dopuszczających wartość null jako osobne zadanie po migracji.

Agent zwraca również uwagę na zagrożenia, które wymagają Twojej uwagi. W przykładzie Matching Game agent oznacza pakiety MetroFramework, ponieważ są one dostępne wyłącznie w środowisku .NET Framework. Prawdopodobny wynik polega na usunięciu MetroFramework i powrocie do standardowych kontrolek Windows Forms, które zmieniają styl wizualny aplikacji.

Przejrzyj proponowane opcje i poinformuj agenta, co chcesz zmienić. Na przykład poinformuj agenta, aby włączył typy referencyjne dopuszczające wartość null lub wstrzymał się i najpierw omówił zamienniki MetroFramework. Gdy wszystko będzie gotowe, odpowiedz confirm , aby zablokować wybrane opcje i przejść do planowania.

Przeglądanie planu

Na etapie planowania agent konwertuje ocenę i potwierdzone opcje na szczegółową specyfikację. Zapisuje wynik do plan.md i tworzy plik scenario-instructions.md, który przechowuje preferencje, decyzje i niestandardowe instrukcje dotyczące uaktualnienia.

Ważna

Jeśli tryb przepływu jest automatyczny, agent rozpoczyna wykonywanie planu bez czasu do przejrzenia.

Plan obejmuje elementy, takie jak kolejność uaktualniania między projektami, docelowy pseudonim platformy dla każdego projektu (net10.0-windowsw przypadku projektów Windows Forms), ścieżki aktualizacji pakietów i środki zaradcze ryzyka dla zmian powodujących niezgodność znalezionych w ocenie.

Aby przejrzeć i dostosować plan:

  1. Otwórz plik plan.md w pliku .github/upgrades/scenarios/dotnet-version-upgrade/.
  2. Przejrzyj strategie uaktualniania i aktualizacje zależności.
  3. Edytuj plan, aby dostosować kroki lub dodać kontekst zgodnie z potrzebami.
  4. Poinformuj agenta, aby przeszedł do etapu wykonania.

Caution

Plan zależy od współzależności projektu. Uaktualnienie nie powiedzie się, jeśli zmodyfikujesz plan w sposób uniemożliwiający ukończenie ścieżki uaktualnienia. Jeśli na przykład funkcja MatchingGame zależy od elementu MatchingGame.Logic i usuniesz element MatchingGame.Logic z planu, uaktualnienie elementu MatchingGame może zakończyć się niepowodzeniem.

Uruchamianie uaktualnienia

Na etapie wykonywania agent dzieli plan na sekwencyjne, konkretne zadania z kryteriami weryfikacji. Agent zapisuje listę zadań do .github/upgrades/scenarios/dotnet-version-upgrade/tasks.md i śledzi ogólny postęp w tym pliku. Dla każdego zadania agent tworzy w katalogu .github/upgrades/scenarios/dotnet-version-upgrade/tasks/ folder zawierający plik Markdown opisujący zadanie oraz plik Markdown zawierający raport z postępów zadania.

W przypadku przykładu gry „Matching Game” lista zadań zazwyczaj obejmuje najpierw zaktualizowanie MatchingGame.Logic, następnie MatchingGame, przywrócenie pakietów, skompilowanie rozwiązania i zatwierdzenie zmian.

Aby uruchomić uaktualnienie:

  1. Poinformuj agenta o rozpoczęciu uaktualniania.
  2. Monitoruj postęp, przeglądając tasks.md, gdy agent aktualizuje statusy zadań. Otwórz foldery poszczególnych zadań w sekcji tasks/, aby wyświetlić opis zadania i szczegółowy raport postępu.
  3. Jeśli agent napotka problem, którego nie można rozwiązać, podaj żądaną pomoc. Na przykład agent może poprosić Cię o wybranie między dwoma zastępczymi interfejsami API lub potwierdzenie, czy zachować przestarzały pakiet.
  4. Na podstawie odpowiedzi agent dostosowuje swoją strategię do pozostałych zadań i kontynuuje.

Agent zatwierdza zmiany zgodnie ze strategią Git skonfigurowaną podczas wstępnej inicjalizacji: dla każdego zadania, dla każdej grupy zadań lub na końcu.

Uwagi dotyczące projektów Visual Basic

Projekty Windows Forms w języku Visual Basic w środowisku .NET Framework często używają plików ustawień System.Configuration i rozszerzeń My, takich jak My.Computer i My.User. Rozszerzenia My zostały usunięte w .NET. Agent flaguje te wzorce podczas oceny i proponuje poprawki podczas wykonywania, ale może być konieczne potwierdzenie poszczególnych zmian podczas przebiegu z przewodnikiem.

Jeśli agent migruje projekt, ale projekt się nie kompiluje, sprawdź, czy plik projektu jest przeznaczony dla systemu Windows i zawiera odwołanie do biblioteki Windows Forms. Element <PropertyGroup> powinien wyglądać podobnie do następującego fragmentu kodu:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <OutputType>WinExe</OutputType>
    <MyType>WindowsForms</MyType>

    <!-- Other settings removed for brevity. -->
  </PropertyGroup>
</Project>

Weryfikowanie uaktualnienia

Po zakończeniu uaktualniania agent zaleca kolejne kroki w odpowiedzi na czat. Monituj agenta o wygenerowanie kompleksowego raportu o zmianie za pomocą polecenia "Generowanie raportu zmiany".

Przejrzyj stan ostatniego zadania w pliku tasks.md i upewnij się, że każdy krok został ukończony.

Aby zweryfikować uaktualnienie:

  1. Skompiluj rozwiązanie i rozwiąż wszelkie błędy kompilacji.

  2. Uruchom aplikację i potwierdź, że formularze ładują się i zachowują się zgodnie z oczekiwaniami.

    Domyślna czcionka w Windows Forms różni się między platformą .NET Framework a .NET, dlatego sprawdź formularze i kontrolki niestandardowe pod kątem różnic w układzie.

  3. Uruchom wszystkie testy jednostkowe w rozwiązaniu i napraw błędy.

  4. Upewnij się, że zaktualizowane pakiety NuGet są zgodne z aplikacją.

  5. Dokładnie przetestuj aplikację, aby sprawdzić, czy uaktualnienie zakończyło się pomyślnie.

Wskazówka

Jeśli projekt nie zostanie uruchomiony i nie można dołączyć debugera, spróbuj ponownie uruchomić Visual Studio. Migrowanie plików projektu z platformy .NET Framework do .NET może mylić projektanta Windows Forms bez ponownego uruchomienia.

Przykład gry w dopasowywanie w Windows Forms został teraz zaktualizowany do platformy .NET 10.

Obsługa po aktualizacji

Jeśli przeniosłeś aplikację z platformy .NET Framework do platformy .NET, zapoznaj się z artykułem Modernize after upgrading to .NET from .NET Framework, aby poznać sposoby stosowania nowszych wzorców, takich jak appsettings.json konfiguracja, wstrzykiwanie zależności czy usługi w chmurze. Wdrożenie tych wzorców jest niezależne od aktualizacji do platformy .NET i nie jest wymagane do jej przeprowadzenia.