Udostępnij za pośrednictwem


Istotne zmiany dotyczące migracji z programu .NET Framework do platformy .NET Core

Jeśli migrujesz aplikację z programu .NET Framework do platformy .NET Core w wersji 1.0 do 3.1, zmiany powodujące niezgodność wymienione w tym artykule mogą mieć wpływ na Ciebie. Zmiany powodujące niezgodność są grupowane według kategorii i w ramach tych kategorii według wersji platformy .NET Core, w której zostały wprowadzone.

Notatka

Ten artykuł nie jest pełną listą zmian powodujących niezgodność między programem .NET Framework i platformą .NET Core. Najważniejsze zmiany powodujące niezgodność są tu dodawane, ponieważ zdajemy sobie sprawę z nich.

Podstawowe biblioteki platformy .NET

.NET 8

interfejs API IDispatchImplAttribute został usunięty

.NET Core 2.1

Zmień wartość domyślną polecenia UseShellExecute

ProcessStartInfo.UseShellExecute ma wartość domyślną false na platformie .NET Core. W programie .NET Framework jego wartość domyślna to true.

Zmień opis

Process.Start pozwala uruchamiać aplikację bezpośrednio, na przykład za pomocą kodu, takiego jak Process.Start("mspaint.exe") uruchamiający aplikację Paint. Umożliwia również pośrednio uruchomienie skojarzonej aplikacji, jeśli ProcessStartInfo.UseShellExecute jest ustawiona na true. W programie .NET Framework domyślną wartością ProcessStartInfo.UseShellExecute jest true, co oznacza, że kod taki jak Process.Start("mytextfile.txt") uruchomi Notatnik, jeśli skojarzysz .txt pliki z tym edytorem. Aby zapobiec pośrednio uruchamianiu aplikacji na platformie .NET Framework, należy jawnie ustawić ProcessStartInfo.UseShellExecute na false. Na platformie .NET Core domyślną wartością ProcessStartInfo.UseShellExecute jest false. Oznacza to, że domyślnie skojarzone aplikacje nie są uruchamiane podczas wywoływania Process.Start.

Następujące właściwości System.Diagnostics.ProcessStartInfo działają tylko wtedy, gdy ProcessStartInfo.UseShellExecute jest true:

Ta zmiana została wprowadzona na platformie .NET Core ze względu na wydajność. Zazwyczaj Process.Start służy do bezpośredniego uruchamiania aplikacji. Bezpośrednie uruchamianie aplikacji nie wymaga zaangażowania powłoki systemu Windows i ponoszenia powiązanych kosztów wydajności. Aby przyspieszyć ten domyślny przypadek, platforma .NET Core zmienia wartość domyślną ProcessStartInfo.UseShellExecute na false. Jeśli tego potrzebujesz, możesz zdecydować się na wolniejszą ścieżkę.

Wersja wprowadzona

2.1

Notatka

We wcześniejszych wersjach platformy .NET Core nie zaimplementowano UseShellExecute dla systemu Windows.

Jeśli Twoja aplikacja opiera się na starym zachowaniu, wywołaj Process.Start(ProcessStartInfo) z ustawieniem UseShellExecute na true na obiekcie ProcessStartInfo.

Kategoria

Podstawowe biblioteki platformy .NET

Interfejsy API, których dotyczy problem


.NET Core 1.0

UnauthorizedAccessException wyrzucane przez FileSystemInfo.Attributes

W programie .NET Core UnauthorizedAccessException jest zgłaszana, gdy obiekt wywołujący próbuje ustawić wartość atrybutu pliku, ale nie ma uprawnień do zapisu.

Zmień opis

W programie .NET Framework ArgumentException jest zgłaszana, gdy obiekt wywołujący próbuje ustawić wartość atrybutu pliku w FileSystemInfo.Attributes, ale nie ma uprawnień do zapisu. W programie .NET Core zamiast tego zostanie zgłoszony UnauthorizedAccessException. (Na platformie .NET Core wyjątek ArgumentException nadal występuje, jeśli obiekt wywołujący próbuje ustawić nieprawidłowy atrybut pliku).

Wprowadzona wersja

1.0

Zmodyfikuj instrukcje catch, aby w razie potrzeby przechwytywały UnauthorizedAccessException zamiast lub oprócz ArgumentException.

Kategoria

Podstawowe biblioteki platformy .NET

Interfejsy API, których dotyczy problem


Obsługa uszkodzonych wyjątków stanu nie jest obsługiwana

Obsługa wyjątków stanu uszkodzonego procesu na platformie .NET Core nie jest obsługiwana.

Zmień opis

Wcześniej wyjątki uszkodzonego stanu procesu mogą być przechwytywane i obsługiwane przez programy obsługi wyjątków kodu zarządzanego, na przykład przy użyciu instrukcji try-catch w języku C#.

Począwszy od programu .NET Core 1.0, wyjątki stanu uszkodzonego procesu nie mogą być obsługiwane przez kod zarządzany. Środowisko uruchomieniowe języka wspólnego nie przekazuje wyjątków stanu uszkodzonego procesu do kodu zarządzanego.

Wersja wprowadzona

1.0

Unikaj konieczności obsługi wyjątków stanu uszkodzonego procesu, rozwiązując sytuacje, które do nich prowadzą. Jeśli jest to absolutnie konieczne do obsługi wyjątków uszkodzonego stanu procesu, napisz procedurę obsługi wyjątków w kodzie C lub C++.

Kategoria

Podstawowe biblioteki platformy .NET

Interfejsy API, których dotyczy problem


Właściwości UriBuilder nie poprzedzają już znaków początkowych

UriBuilder.Fragment nie poprzedza już wiodącego znaku # i UriBuilder.Query nie poprzedza już wiodącego znaku ?, gdy już istnieje.

Zmień opis

W programie .NET Framework właściwości UriBuilder.Fragment i UriBuilder.Query zawsze dodają odpowiednio znak # lub ? na początku przechowywanej wartości. To zachowanie może spowodować wiele # lub ? znaków w przechowywanej wartości, jeśli ciąg zawiera już jeden z tych znaków wiodących. Na przykład wartość UriBuilder.Fragment może stać się ##main.

Począwszy od platformy .NET Core 1.0, te właściwości nie poprzedzają już wartości przechowywanej znakami # ani ?, jeśli już znajdują się one na początku ciągu.

Wersja wprowadzona

1.0

Nie trzeba już jawnie usuwać żadnego z tych znaków wiodących podczas ustawiania wartości właściwości. Jest to szczególnie przydatne podczas dołączania wartości, ponieważ nie trzeba już usuwać wiodących # lub ? za każdym razem, gdy dołączasz.

Na przykład poniższy fragment kodu przedstawia różnicę zachowania między programem .NET Framework i platformą .NET Core.

var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";

Console.WriteLine(builder.Query);
  • W programie .NET Framework dane wyjściowe są ????one=1&two=2&three=3&four=4.
  • W programie .NET Core dane wyjściowe są ?one=1&two=2&three=3&four=4.

Kategoria

Podstawowe biblioteki platformy .NET

Interfejsy API, których dotyczy problem


Process.StartInfo zgłasza wyjątek InvalidOperationException dla procesów, których nie uruchomiono

Odczytywanie właściwości Process.StartInfo dla procesów, których nie uruchomił twój kod, zgłasza InvalidOperationException.

Zmień opis

W programie .NET Framework uzyskiwanie dostępu do właściwości Process.StartInfo dla procesów, których kod nie rozpoczął, zwraca fikcyjny obiekt ProcessStartInfo. Fikcyjny obiekt zawiera wartości domyślne dla wszystkich jego właściwości, z wyjątkiem EnvironmentVariables.

Począwszy od platformy .NET Core 1.0, jeśli odczytujesz właściwość Process.StartInfo dla procesu, który nie został uruchomiony (czyli przez wywołanie Process.Start), zostanie zgłoszony InvalidOperationException.

Wprowadzona wersja

1.0

Nie należy uzyskiwać dostępu do właściwości Process.StartInfo dla procesów, które nie zostały uruchomione przez Twój kod. Na przykład nie odczytuj tej właściwości dla procesów zwracanych przez Process.GetProcesses.

Kategoria

Podstawowe biblioteki platformy .NET

Interfejsy API, których dotyczy problem


Kryptografia

.NET Core 2.1

Parametr logiczny signedCms.ComputeSignature jest przestrzegany

W programie .NET Core jest uwzględniany parametr logiczny silent metody SignedCms.ComputeSignature(CmsSigner, Boolean). Monit o podanie numeru PIN nie jest wyświetlany, jeśli ten parametr ma ustawioną wartość true.

Zmień opis

W programie .NET Framework parametr silent metody SignedCms.ComputeSignature(CmsSigner, Boolean) jest ignorowany, a monit o podanie numeru PIN jest zawsze wyświetlany, jeśli jest to wymagane przez dostawcę. W programie .NET Core parametr silent jest przestrzegany, a jeśli ustawiono wartość true, monit o podanie numeru PIN nigdy nie jest wyświetlany, nawet jeśli jest wymagany przez dostawcę.

Obsługa komunikatów CMS/PKCS #7 została wprowadzona do platformy .NET Core w wersji 2.1.

Wprowadzona wersja

2.1

Aby upewnić się, że w razie potrzeby zostanie wyświetlony monit o podanie numeru PIN, aplikacje klasyczne powinny wywołać SignedCms.ComputeSignature(CmsSigner, Boolean) i ustawić parametr logiczny na wartość false. Wynikowe zachowanie jest takie samo jak w programie .NET Framework niezależnie od tego, czy kontekst dyskretny jest tam wyłączony.

Kategoria

Kryptografia

Interfejsy API, których dotyczy problem


MSBuild

.NET Core 3.0

Zmiana nazwy pliku manifestu zasobu

Począwszy od platformy .NET Core 3.0, w domyślnym przypadku program MSBuild generuje inną nazwę pliku manifestu dla plików zasobów.

Wprowadzona wersja

3.0

Zmień opis

Jeśli przed programem .NET Core 3.0 nie określono metadanych LogicalName, ManifestResourceNamelub DependentUpon dla elementu EmbeddedResource w pliku projektu, program MSBuild wygenerował nazwę pliku manifestu we wzorcu <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources. Jeśli RootNamespace nie jest zdefiniowana w pliku projektu, wartość domyślna to nazwa projektu. Na przykład wygenerowana nazwa manifestu dla pliku zasobu o nazwie Form1.resx w katalogu głównym projektu została MyProject.Form1.resources.

Począwszy od platformy .NET Core 3.0, jeśli plik zasobu jest współlokowany z plikiem źródłowym o tej samej nazwie (na przykład Form1.resx i Form1.cs), program MSBuild używa informacji o typie z pliku źródłowego w celu wygenerowania nazwy pliku manifestu we wzorcu <Namespace>.<ClassName>.resources. Przestrzeń nazw i nazwa klasy są wyodrębniane z pierwszego typu w kolokowanym pliku źródłowym. Na przykład wygenerowana nazwa manifestu dla pliku zasobu o nazwie Form1.resx, który jest współlokowany z plikiem źródłowym o nazwie Form1.cs jest MyNamespace.Form1.resources. Najważniejsze jest to, że pierwsza część nazwy pliku różni się od wcześniejszych wersji platformy .NET Core (MyNamespace zamiast MyProject).

Notatka

Jeśli masz metadane LogicalName, ManifestResourceNamelub DependentUpon określone w elemencie EmbeddedResource w pliku projektu, ta zmiana nie ma wpływu na ten plik zasobu.

Ta zmiana powodująca niezgodność została wprowadzona wraz z dodaniem właściwości EmbeddedResourceUseDependentUponConvention do projektów platformy .NET Core. Domyślnie pliki zasobów nie są jawnie wyszczególnione w pliku projektu platformy .NET Core, co oznacza, że nie mają metadanych DependentUpon do określenia, jak nazwać wygenerowany plik .resources. Gdy EmbeddedResourceUseDependentUponConvention jest ustawiona na true, która jest wartością domyślną, program MSBuild wyszukuje kolokowany plik źródłowy i wyodrębnia przestrzeń nazw i nazwę klasy z tego pliku. Jeśli ustawisz EmbeddedResourceUseDependentUponConvention na false, program MSBuild wygeneruje nazwę manifestu zgodnie z poprzednim zachowaniem, które łączy RootNamespace i względną ścieżkę pliku.

W większości przypadków nie jest wymagana żadna akcja ze strony dewelopera, a aplikacja powinna nadal działać. Jednak jeśli ta zmiana spowoduje, że aplikacja przestanie działać, możesz zrobić jedno z następujących:

  • Zmień kod, aby uwzględniał nową nazwę manifestu.

  • Zrezygnuj z nowej konwencji nazewnictwa, ustawiając EmbeddedResourceUseDependentUponConvention na false w pliku projektu.

    <PropertyGroup>
      <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
    </PropertyGroup>
    

Kategoria

MSBuild

Interfejsy API, których dotyczy problem

N/A


Sieci

.NET Core 2.0

Program WebClient.CancelAsync nie zawsze anuluje natychmiast

Począwszy od platformy .NET Core 2.0, wywoływanie WebClient.CancelAsync() nie anuluje żądania natychmiast, jeśli rozpoczęło się pobieranie odpowiedzi.

Zmień opis

Wcześniej wywołanie WebClient.CancelAsync() natychmiast anulowało żądanie. Począwszy od platformy .NET Core 2.0, wywołanie metody WebClient.CancelAsync() powoduje natychmiastowe anulowanie żądania tylko wtedy, gdy odpowiedź nie zaczęła być pobierana. Jeśli odpowiedź zaczęła być pobierana, żądanie zostanie anulowane dopiero po przeczytaniu pełnej odpowiedzi.

Ta zmiana została zaimplementowana, ponieważ interfejs API WebClient jest wycofany na rzecz HttpClient.

Wprowadzona wersja

2.0

Użyj klasy System.Net.Http.HttpClient zamiast System.Net.WebClient, która jest przestarzała.

Kategoria

Tworzenie sieci

Interfejsy API, których dotyczy problem


Formularze systemu Windows

Obsługa formularzy systemu Windows została dodana do platformy .NET Core w wersji 3.0. Jeśli migrujesz aplikację Windows Forms z programu .NET Framework do platformy .NET Core, zmiany powodujące niezgodność wymienione tutaj mogą mieć wpływ na twoją aplikację.

.NET Core 3.1

Usunięte kontrolki

Począwszy od platformy .NET Core 3.1, niektóre kontrolki windows Forms nie są już dostępne.

Zmień opis

Począwszy od platformy .NET Core 3.1, różne kontrolki windows Forms nie są już dostępne. Kontrolki zastępcze, które mają lepszy projekt i obsługę, zostały wprowadzone w programie .NET Framework 2.0. Przestarzałe kontrolki zostały wcześniej usunięte z przybornika projektanta, ale nadal były dostępne do użycia.

Następujące typy nie są już dostępne:

Wprowadzona wersja

3.1

Każda usunięta kontrolka ma zalecaną kontrolkę zastępczą. Zapoznaj się z następującą tabelą:

Usunięto kontrolkę (API) Zalecane zastąpienie Powiązane interfejsy API, które są usuwane
Menu kontekstowe ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Główne Menu MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu KolekcjaElementówMenu
MenuItem ToolStripMenuItem
Pasek narzędzi ToolStrip Wygląd paska narzędzi
Przycisk Paska Narzędzi Przycisk Paska Narzędzi ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


Zdarzenie formatowania komórek nie jest zgłaszane, jeśli jest wyświetlana etykietka narzędzia

DataGridView teraz pokazuje tekst komórki oraz podpowiedzi błędów, gdy wskaźnik myszy jest nad nimi i gdy są one wybrane za pomocą klawiatury. Jeśli zostanie wyświetlona etykietka narzędzia, zdarzenie DataGridView.CellFormatting nie zostanie zgłoszone.

Zmień opis

Przed programem .NET Core 3.1 DataGridView, który miał właściwość ShowCellToolTips ustawioną na true pokazywał etykietkę narzędzia dla tekstu komórki i błędy po umieszczeniu wskaźnika myszy na komórce. Etykietki narzędzi nie były wyświetlane, gdy komórka została wybrana za pomocą klawiatury (na przykład za pomocą Tab, skrótów lub nawigacji strzałką). Jeśli użytkownik edytował komórkę, a następnie, podczas gdy DataGridView był nadal w trybie edycji, najechał kursorem na komórkę, która nie miała ustawionej właściwości ToolTipText, zdarzenie CellFormatting zostało wywołane w celu sformatowania tekstu komórki do wyświetlenia.

Aby spełnić standardy ułatwień dostępu, począwszy od platformy .NET Core 3.1, DataGridView, która ma właściwość ShowCellToolTips ustawioną na true, pokazuje etykiety narzędziowe dla tekstu komórki i błędów nie tylko wtedy, gdy komórka jest najechana myszką, ale także po wybraniu jej za pomocą klawiatury. W wyniku tej zmiany zdarzenie CellFormatting nie jest zgłaszane, gdy komórki, które nie mają właściwości ToolTipText ustawionej są najechane myszką, gdy DataGridView jest w trybie edycji. Zdarzenie nie jest wywoływane, ponieważ zawartość komórki, nad którą przesunięto kursor, jest wyświetlana jako etykieta narzędzia zamiast w komórce.

Wersja wprowadzona

3.1

Refaktoryzuj dowolny kod, który zależy od zdarzenia CellFormatting, podczas gdy DataGridView jest w trybie edycji.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

Żaden


.NET Core 3.0

Domyślna czcionka kontrolki została zmieniona na Segoe UI 9 pkt

Zmień opis

W programie .NET Framework właściwość Control.DefaultFont została ustawiona na Microsoft Sans Serif 8.25 pt. Na poniższej ilustracji przedstawiono okno, które używa czcionki domyślnej.

Domyślna czcionka kontrolki w programie .NET Framework

Począwszy od platformy .NET Core 3.0, domyślna czcionka jest ustawiona na Segoe UI 9 pt (ta sama czcionka co SystemFonts.MessageBoxFont). W wyniku tej zmiany formularze i kontrolki mają rozmiar około 27% większe, aby uwzględnić większy rozmiar nowej czcionki domyślnej. Na przykład:

Domyślna czcionka kontrolki na platformie .NET Core

Ta zmiana została wprowadzona w celu dostosowania do wytycznych dotyczących środowiska użytkownika systemu Windows .

Wersja wprowadzona

3.0

Ze względu na zmianę rozmiaru formularzy i kontrolek upewnij się, że aplikacja jest poprawnie renderowana.

Aby zachować oryginalną czcionkę dla pojedynczego formularza, ustaw domyślną czcionkę na Microsoft Sans Serif 8.25 pt. Na przykład:

public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}

Możesz też zmienić czcionkę domyślną dla całej aplikacji na jeden z następujących sposobów:

  • Ustawiając właściwość ApplicationDefaultFont MSBuild na "Microsoft Sans Serif, 8.25pt". Jest to preferowana technika, ponieważ umożliwia programowi Visual Studio używanie nowych ustawień w projektancie.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Wywołując kod Application.SetDefaultFont(Font).

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

Kategoria

  • Formularze systemu Windows

Interfejsy API, których dotyczy problem

Żaden.


Modernizacja folderuBrowserDialog

Kontrolka FolderBrowserDialog została zmieniona w aplikacjach Windows Forms dla platformy .NET Core.

Zmień opis

W programie .NET Framework formularze systemu Windows używają następującego okna dialogowego dla kontrolki FolderBrowserDialog:

FolderBrowserDialogControl w programie .NET Framework

W programie .NET Core 3.0 windows Forms używa nowszej kontrolki opartej na modelu COM wprowadzonej w systemie Windows Vista:

FolderBrowserDialogControl w .NET Core

Wprowadzona wersja

3.0

Okno dialogowe zostanie automatycznie uaktualnione.

Jeśli chcesz zachować oryginalne okno dialogowe, ustaw właściwość FolderBrowserDialog.AutoUpgradeEnabled na false przed wyświetleniem okna dialogowego, jak pokazano na poniższym fragmentze kodu:

var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


SerializableAttribute usunięto z niektórych typów formularzy systemu Windows

SerializableAttribute został usunięty z niektórych klas windows Forms, które nie mają znanych scenariuszy serializacji binarnej.

Zmień opis

Następujące typy są oznaczone SerializableAttribute w .NET Framework, ale atrybut usunięto w .NET Core.

Historycznie ten mechanizm serializacji miał poważne obawy związane z konserwacją i bezpieczeństwem. Utrzymywanie SerializableAttribute w kontekście typów oznacza, że te typy muszą być testowane pod kątem zmian serializacji między wersjami i potencjalnie między różnymi frameworkami. Utrudnia to rozwój tych typów i może być kosztowny do utrzymania. Te typy nie mają znanych scenariuszy serializacji binarnej, co minimalizuje wpływ usunięcia atrybutu.

Aby uzyskać więcej informacji, zobacz Serializacja binarna.

Wersja wprowadzona

3.0

Zaktualizuj dowolny kod, który może zależeć od tych typów oznaczonych jako możliwe do serializacji.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

  • Żaden

Przełącznik zgodności AllowUpdateChildControlIndexForTabControls nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls jest obsługiwany w systemach Windows Forms w programie .NET Framework 4.6 lub nowszych wersjach, ale nie jest obsługiwany na platformie .NET Core lub .NET 5.0 i nowszych wersjach.

Zmień opis

W programie .NET Framework 4.6 i nowszych wersjach, wybranie karty powoduje zmianę kolejności jej kolekcji kontrolek. Przełącznik zgodności Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls umożliwia aplikacji pomijanie tej zmiany kolejności, gdy to zachowanie jest niepożądane.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls nie jest obsługiwany.

Wersja wprowadzona

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

  • Żaden

DomainUpDown.UseLegacyScrolling przełącznik zgodności nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling wprowadzony w programie .NET Framework 4.7.1 nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 i nowszych wersjach.

Zmień opis

Począwszy od wersji .NET Framework 4.7.1, przełącznik zgodności Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling umożliwia deweloperom rezygnację z niezależnych akcji DomainUpDown.DownButton() i DomainUpDown.UpButton(). Przełącznik przywrócił starsze działanie, w którym DomainUpDown.UpButton() jest ignorowany, jeśli obecny jest tekst kontekstu, a programista musi najpierw użyć akcji DomainUpDown.DownButton() na kontrolce przed akcją DomainUpDown.UpButton(). Aby uzyskać więcej informacji, zobacz <AppContextSwitchOverrides> element.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling nie jest obsługiwany.

Wprowadzona wersja

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


Przełącznik zgodności DoNotLoadLatestRichEditControl nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.UseLegacyImages wprowadzony w programie .NET Framework 4.7.1 nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 i nowszych wersjach.

Zmień opis

W programie .NET Framework 4.6.2 i wcześniejszych wersjach, kontrolka RichTextBox tworzy instancję kontrolki Win32 RichEdit w wersji 3.0, a dla aplikacji, które są przeznaczone na platformę .NET Framework 4.7.1, kontrolka RichTextBox tworzy instancję RichEdit w wersji 4.1 (w msftedit.dll). Przełącznik zgodności Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl został wprowadzony, aby umożliwić aplikacjom przeznaczonym dla programu .NET Framework 4.7.1 i nowszych wersji rezygnację z nowej kontrolki RichEdit w wersji 4.1 i zamiast tego użyć starej kontrolki RichEdit w wersji 3.

W wersjach .NET Core i .NET 5.0 i nowszych przełącznik Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl nie jest obsługiwany. Obsługiwane są tylko nowe wersje kontrolki RichTextBox.

Wprowadzona wersja

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


Przełącznik zgodności DoNotSupportSelectAllShortcutInMultilineTextBox nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, który został wprowadzony w programie .NET Framework 4.6.1, nie jest obsługiwany w systemach Windows Forms na platformie .NET Core i .NET 5.0 i nowszych wersjach.

Zmień opis

Począwszy od programu .NET Framework 4.6.1, zaznacz Ctrl + skrótu w kontrolce TextBox zaznaczonego całego tekstu. W programie .NET Framework 4.6 i wcześniejszych wersjach naciśnięcie skrótu Ctrl + nie zaznaczało całego tekstu, jeśli właściwość Textbox.ShortcutsEnabled i TextBox.Multiline były ustawione na true. Przełącznik zgodności Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox został wprowadzony w programie .NET Framework 4.6.1, aby zachować oryginalne zachowanie. Aby uzyskać więcej informacji, zobacz TextBox.ProcessCmdKey.

W wersjach .NET Core i .NET 5.0 i nowszych przełącznik Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox nie jest obsługiwany.

Wersja wprowadzona

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

  • Żaden

Przełącznik zgodności DontSupportReentrantFilterMessage nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, który został wprowadzony w programie .NET Framework 4.6.1, nie jest obsługiwany w systemach Windows Forms na platformie .NET Core i .NET 5.0 i nowszych wersjach.

Zmień opis

Począwszy od .NET Framework 4.6.1, przełącznik zgodności Switch.System.Windows.Forms.DontSupportReentrantFilterMessage rozwiązuje możliwe wyjątki IndexOutOfRangeException, gdy dochodzi do wywołania komunikatu Application.FilterMessage z niestandardową implementacją IMessageFilter.PreFilterMessage. Aby uzyskać więcej informacji, zobacz Mitigation: Custom IMessageFilter.PreFilterMessage Implementations.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.DontSupportReentrantFilterMessage nie jest obsługiwany.

Wprowadzona wersja

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


Przełącznik zgodności EnableVisualStyleValidation nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.EnableVisualStyleValidation nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 lub nowszym.

Zmień opis

W programie .NET Framework przełącznik zgodności Switch.System.Windows.Forms.EnableVisualStyleValidation pozwolił aplikacji zrezygnować z walidacji stylów wizualizacji dostarczonych w postaci liczbowej.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.EnableVisualStyleValidation nie jest obsługiwany.

Wersja wprowadzona

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

  • Żaden

Przełącznik zgodności UseLegacyContextMenuStripSourceControlValue nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue wprowadzony w programie .NET Framework 4.7.2 nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 i nowszych wersjach.

Zmień opis

Począwszy od programu .NET Framework 4.7.2, przełącznik zgodności Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue umożliwia deweloperowi rezygnację z nowego zachowania właściwości ContextMenuStrip.SourceControl, która teraz zwraca odwołanie do kontroli źródła. Poprzednie zachowanie właściwości polegało na zwracaniu null. Aby uzyskać więcej informacji, zobacz <AppContextSwitchOverrides> element.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue nie jest obsługiwany.

Wprowadzona wersja

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem


Przełącznik zgodności UseLegacyImages nie jest obsługiwany

Przełącznik zgodności Switch.System.Windows.Forms.UseLegacyImages wprowadzony w programie .NET Framework 4.8 nie jest obsługiwany w systemie Windows Forms na platformie .NET Core lub .NET 5.0 lub nowszym.

Zmień opis

Począwszy od programu .NET Framework 4.8, przełącznik zgodności Switch.System.Windows.Forms.UseLegacyImages rozwiązał możliwe problemy ze skalowaniem obrazów w scenariuszach Technologii ClickOnce w środowiskach o wysokiej rozdzielczości DPI. W przypadku ustawienia wartości trueprzełącznik umożliwia użytkownikowi przywrócenie starszego skalowania obrazów na ekranach o wysokiej rozdzielczości DPI, których skala jest ustawiona na większą niż 100%. Aby uzyskać więcej informacji, zobacz Uwagi do wydania .NET Framework 4.8 na GitHub.

W programach .NET Core i .NET 5.0 lub nowszych przełącznik Switch.System.Windows.Forms.UseLegacyImages nie jest obsługiwany.

Wersja wprowadzona

3.0

Usuń przełącznik. Przełącznik nie jest obsługiwany i nie jest dostępna żadna alternatywna funkcja.

Kategoria

Formularze systemu Windows

Interfejsy API, których dotyczy problem

  • Żaden

Szablony About i SplashScreen są uszkodzone

Pliki About.vb i SplashScreen.vb generowane przez program Visual Studio zawierają odwołania do typów w przestrzeni nazw My, które nie są dostępne .NET Core 3.0 i 3.1.

Wersja wprowadzona

3.0

Zmień opis

Programy .NET Core 3.0 i 3.1 nie zawierają pełnej obsługi My Visual Basic. Szablony formularzy About i SplashScreen w programie Visual Studio dla aplikacji Visual Basic Windows Forms odwołują się do właściwości w typie My.Application.Info, które nie są dostępne.

Ulepszono obsługę programu Visual Basic My na platformie .NET 5, uaktualnij projekt do platformy .NET 5 lub nowszej.

-lub-

Napraw błędy kompilatora w typach About and SplashScreen. Użyj klasy System.Reflection.Assembly, aby uzyskać informacje podane przez typ My.Application.Info. W tym miejscu dostępny jest prosty port obu formularzy.

Napiwek

Jest to przykładowy kod i niezoptymalizowany. Lista atrybutów powinna być buforowana, aby skrócić czas ładowania formularza.

about

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

Ekran powitalny

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

Kategoria

Visual Basic Windows Forms

Interfejsy API, których dotyczy problem

Żaden


Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices są niedostępne

Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices nie są dostępne.

Wersja wprowadzona

.NET Core 3.0

Zmień opis

Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices były dostępne w programie .NET Framework. Nie są one dostępne na platformie .NET Core 3.0 — 3.1.

Typy zostały usunięte, aby uniknąć niepotrzebnych zależności asemblii lub problemów z niezgodnością w kolejnych wersjach.

Ta przestrzeń nazw została dodana na platformie .NET 5, uaktualnij projekt do platformy .NET 5 lub nowszej.

-lub-

Jeśli kod zależy od użycia typów Microsoft.VisualBasic.ApplicationServices i ich składowych, możesz użyć odpowiedniego typu lub elementu członkowskiego w bibliotece klas platformy .NET. Na przykład niektóre System.Environment i System.Security.Principal.WindowsIdentity składowe zapewniają równoważne funkcje właściwościom klasy Microsoft.VisualBasic.ApplicationServices.User.

Kategoria

Visual Basic

Interfejsy API, których dotyczy problem


Typy w przestrzeni nazw Microsoft.VisualBasic.Devices są niedostępne

Typy w przestrzeni nazw Microsoft.VisualBasic.Devices nie są dostępne.

Wersja wprowadzona

.NET Core 3.0

Zmień opis

Typy w przestrzeni nazw Microsoft.VisualBasic.Devices były dostępne w programie .NET Framework. Nie są one dostępne na platformie .NET Core 3.0 — 3.1.

Typy zostały usunięte, aby uniknąć niepotrzebnych zależności zestawów lub zmian powodujących niezgodność w kolejnych wersjach.

Ta przestrzeń nazw została dodana na platformie .NET 5, uaktualnij projekt do platformy .NET 5 lub nowszej.

-lub-

Jeśli kod zależy od użycia typów Microsoft.VisualBasic.Devices i ich składowych, możesz użyć odpowiedniego typu lub elementu członkowskiego w bibliotece klas platformy .NET. Na przykład równoważne funkcje klasy Microsoft.VisualBasic.Devices.Clock są udostępniane przez typy System.DateTime i System.Environment, a równoważne funkcje klasy Microsoft.VisualBasic.Devices.Ports są udostępniane przez typy w przestrzeni nazw System.IO.Ports.

Kategoria

Visual Basic

Interfejsy API, których dotyczy problem


Typy w przestrzeni nazw Microsoft.VisualBasic.MyServices są niedostępne

Typy w przestrzeni nazw Microsoft.VisualBasic.MyServices nie są dostępne.

Wersja wprowadzona

.NET Core 3.0

Zmień opis

Typy w przestrzeni nazw Microsoft.VisualBasic.MyServices były dostępne w programie .NET Framework. Nie są one dostępne na platformie .NET Core 3.0 — 3.1.

Typy zostały usunięte, aby uniknąć niepotrzebnych zależności montażowych lub znaczących zmian w kolejnych wersjach.

Ta przestrzeń nazw została dodana na platformie .NET 5, uaktualnij projekt do platformy .NET 5 lub nowszej.

-lub-

Jeśli twój kod zależy od użycia typów i ich członków z Microsoft.VisualBasic.MyServices, to w bibliotece klas .NET istnieją odpowiednie typy i członkowie. Poniżej przedstawiono mapowanie typów Microsoft.VisualBasic.MyServices na ich równoważne typy bibliotek klas platformy .NET:

Typ Microsoft.VisualBasic.MyServices Typ biblioteki klas platformy .NET
ClipboardProxy System.Windows.Clipboard dla aplikacji WPF System.Windows.Forms.Clipboard dla aplikacji Windows Forms
FileSystemProxy Typy w przestrzeni nazw System.IO
RegistryProxy Typy związane z rejestrem w przestrzeni nazw Microsoft.Win32
SpecialDirectoriesProxy Environment.GetFolderPath

Kategoria

Visual Basic

Interfejsy API, których dotyczy problem


Zobacz też