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
- zmień wartość domyślną polecenia UseShellExecute
- Atrybut IDispatchImplAttribute API został usunięty
- UnauthorizedAccessException rzucane przez FileSystemInfo.Attributes
- Obsługa wyjątków w stanie uszkodzonego procesu nie jest obsługiwana
- właściwości UriBuilder nie poprzedzają już znaków wiodących
- Process.StartInfo zgłasza wyjątek InvalidOperationException dla procesów, których nie uruchomiono
.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
:
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
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.
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- legacyCorruptedStateExceptionsPolicy, element
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
, ManifestResourceName
lub 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
, ManifestResourceName
lub 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.
Zalecana akcja
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
nafalse
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
Zalecana akcja
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ę.
- Usunięte kontrolki
- zdarzenie CellFormatting nie zostało zgłoszone, jeśli etykietka narzędzia jest wyświetlana
- Control.DefaultFont został zmieniony na Segoe UI 9 pt
- modernizacja folderuBrowserDialog
- SerializableAttribute został usunięty z niektórych typów formularza Windows Forms
- przełącznik zgodności AllowUpdateChildControlIndexForTabControls nie jest obsługiwany
- Przełącznik zgodności DomainUpDown.UseLegacyScrolling nie jest obsługiwany
- Przełącznik zgodności DoNotLoadLatestRichEditControl nie jest obsługiwany
- przełącznik zgodności DoNotSupportSelectAllShortcutInMultilineTextBox nie jest obsługiwany
- Przełącznik zgodności DontSupportReentrantFilterMessage nie jest obsługiwany
- przełącznik zgodności EnableVisualStyleValidation nie jest obsługiwany
- przełącznik zgodności UseLegacyContextMenuStripSourceControlValue nie jest obsługiwany
- przełącznik zgodności UseLegacyImages nie jest obsługiwany
- szablony About and SplashScreen są uszkodzone dla Visual Basic
- : Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices są niedostępne
- Typy w przestrzeni nazw Microsoft.VisualBasic.Devices są niedostępne
Types in Microsoft.VisualBasic.MyServices namespace not available (Typyw przestrzeni nazw Microsoft.VisualBasic.MyServices)
.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:
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
Wprowadzona wersja
3.1
Zalecana akcja
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
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
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
Zalecana akcja
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.
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:
Ta zmiana została wprowadzona w celu dostosowania do wytycznych dotyczących środowiska użytkownika systemu Windows .
Wersja wprowadzona
3.0
Zalecana akcja
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:
W programie .NET Core 3.0 windows Forms używa nowszej kontrolki opartej na modelu COM wprowadzonej w systemie Windows Vista:
Wprowadzona wersja
3.0
Zalecana akcja
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.
System.InvariantComparer
- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore
- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRef
System.Resources.ResXDataNode
System.Resources.ResXFileRef
- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCT
System.Windows.Forms.NativeMethods.MSG
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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
Zalecana akcja
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 true
przełą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
Zalecana akcja
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.
Zalecana akcja
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 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.
Zalecana akcja
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.
Zalecana akcja
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.
Zalecana akcja
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ż
- API , które zawsze generują wyjątki w .NET Core
- technologie platformy .NET Framework niedostępne na platformie .NET Core