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.
Uwaga
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
- Interfejs API IDispatchImplAttribute został usunięty
- Brak autoryzacjiAccessWyrażenie zgłaszane przez fileSystemInfo.Attributes
- Obsługa uszkodzonych wyjątków stanu 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ść false
domyślną na platformie .NET Core. W programie .NET Framework jego wartością domyślną jest true
.
Opis zmiany
Process.Start umożliwia uruchamianie aplikacji bezpośrednio, na przykład za pomocą kodu, takiego jak Process.Start("mspaint.exe")
uruchomienie programu Paint. Umożliwia również pośrednio uruchomienie skojarzonej aplikacji, jeśli ProcessStartInfo.UseShellExecute jest ustawiona na true
wartość . W programie .NET Framework wartość domyślna to ProcessStartInfo.UseShellExecute true
, co oznacza, że kod, taki jak Process.Start("mytextfile.txt")
Notatnik, jeśli skojarzysz .txt pliki z tym edytorem. Aby zapobiec pośrednio uruchamianiu aplikacji na platformie .NET Framework, należy jawnie ustawić wartość ProcessStartInfo.UseShellExecute false
. Na platformie .NET Core domyślną wartością parametru ProcessStartInfo.UseShellExecute jest false
. Oznacza to, że domyślnie skojarzone aplikacje nie są uruchamiane podczas wywoływania metody Process.Start
.
Następujące właściwości w systemie System.Diagnostics.ProcessStartInfo działają tylko wtedy, gdy ProcessStartInfo.UseShellExecute to true
:
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
Ta zmiana została wprowadzona na platformie .NET Core ze względu na wydajność. Process.Start Zazwyczaj 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ą na ProcessStartInfo.UseShellExecute false
. Jeśli jest to potrzebne, możesz wyrazić zgodę na wolniejsze ścieżki.
Wprowadzona wersja
2.1
Uwaga
We wcześniejszych wersjach platformy .NET Core UseShellExecute
nie zaimplementowano dla systemu Windows.
Zalecana akcja
Jeśli aplikacja opiera się na starym zachowaniu, wywołaj metodę Process.Start(ProcessStartInfo) z ustawioną wartością UseShellExecute true
ProcessStartInfo na obiekt .
Kategoria
Podstawowe biblioteki platformy .NET
Dotyczy interfejsów API
.NET Core 1.0
Brak autoryzacjiAccessWyrażenie zgłaszane przez fileSystemInfo.Attributes
W programie .NET Core obiekt jest zgłaszany, gdy obiekt wywołujący próbuje ustawić wartość atrybutu pliku, UnauthorizedAccessException ale nie ma uprawnień do zapisu.
Opis zmiany
W programie .NET Framework obiekt jest zgłaszany, ArgumentException gdy obiekt wywołujący próbuje ustawić wartość atrybutu pliku, FileSystemInfo.Attributes ale nie ma uprawnień do zapisu. W programie .NET Core zamiast tego jest zgłaszany element UnauthorizedAccessException . (W programie .NET Core obiekt jest nadal zgłaszany, ArgumentException jeśli obiekt wywołujący próbuje ustawić nieprawidłowy atrybut pliku).
Wprowadzona wersja
1.0
Zalecana akcja
Zmodyfikuj dowolne catch
instrukcje, aby przechwycić UnauthorizedAccessException zamiast lub oprócz ArgumentExceptionelementu , w razie potrzeby.
Kategoria
Podstawowe biblioteki platformy .NET
Dotyczy interfejsów API
Obsługa uszkodzonych wyjątków stanu nie jest obsługiwana
Obsługa uszkodzonych wyjątków stanu procesu na platformie .NET Core nie jest obsługiwana.
Opis zmiany
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 dostarcza uszkodzonych wyjątków stanu procesu do kodu zarządzanego.
Wprowadzona wersja
1.0
Zalecana akcja
Unikaj konieczności obsługi uszkodzonych wyjątków stanu procesu, zwracając się do sytuacji, które zamiast tego prowadzą do nich. 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
Dotyczy interfejsów API
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- legacyCorruptedStateExceptionsPolicy, element
Właściwości UriBuilder nie poprzedzają już znaków wiodących
UriBuilder.Fragmentnie poprzedza już znaku wiodącego #
?
i UriBuilder.Query nie poprzedza już wiodącego znaku, gdy jest już obecny.
Opis zmiany
W programie .NET Framework UriBuilder.Fragment właściwości i UriBuilder.Query zawsze poprzedzają #
odpowiednio znak lub ?
do przechowywanej wartości. To zachowanie może spowodować powstanie wielu #
znaków lub ?
znaków w przechowywanej wartości, jeśli ciąg zawiera już jeden z tych znaków wiodących. Na przykład wartość może stać się wartością UriBuilder.Fragment ##main
.
Począwszy od platformy .NET Core 1.0, te właściwości nie poprzedzają #
już wartości przechowywanej ani ?
znaków, jeśli są one już obecne na początku ciągu.
Wprowadzona wersja
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 w przypadku dołączania wartości, ponieważ nie trzeba już usuwać elementów 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 to
????one=1&two=2&three=3&four=4
. - W programie .NET Core dane wyjściowe to
?one=1&two=2&three=3&four=4
.
Kategoria
Podstawowe biblioteki platformy .NET
Dotyczy interfejsów API
Process.StartInfo zgłasza wyjątek InvalidOperationException dla procesów, których nie uruchomiono
Odczytywanie Process.StartInfo właściwości dla procesów, których kod nie rozpoczął, zgłasza błąd InvalidOperationException.
Opis zmiany
W programie .NET Framework uzyskiwanie Process.StartInfo dostępu do właściwości procesów, których kod nie rozpoczął, zwraca fikcyjny ProcessStartInfo obiekt. 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 Process.StartInfo właściwość dla procesu, który nie został uruchomiony (czyli przez wywołanie metody Process.Start), InvalidOperationException jest zgłaszany.
Wprowadzona wersja
1.0
Zalecana akcja
Nie należy uzyskiwać Process.StartInfo dostępu do właściwości dla procesów, których kod nie został uruchomiony. Na przykład nie odczytuj tej właściwości dla procesów zwracanych przez Process.GetProcesses.
Kategoria
Podstawowe biblioteki platformy .NET
Dotyczy interfejsów API
Kryptografia
.NET Core 2.1
Parametr logiczny signedCms.ComputeSignature jest przestrzegany
W programie .NET Core jest uwzględniany parametr SignedCms.ComputeSignature(CmsSigner, Boolean) logiczny silent
metody. Monit o podanie numeru PIN nie jest wyświetlany, jeśli ten parametr jest ustawiony na true
wartość .
Opis zmiany
W programie .NET Framework silent
parametr SignedCms.ComputeSignature(CmsSigner, Boolean) metody jest ignorowany, a monit o podanie numeru PIN jest zawsze wyświetlany, jeśli jest to wymagane przez dostawcę. W programie .NET Core silent
parametr jest przestrzegany, a jeśli ustawiono true
wartość , 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ływać SignedCms.ComputeSignature(CmsSigner, Boolean) i ustawiać parametr logiczny na false
wartość . Wynikowe zachowanie jest takie samo jak w programie .NET Framework niezależnie od tego, czy kontekst dyskretny jest tam wyłączony.
Kategoria
Kryptografia
Dotyczy interfejsów API
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
Opis zmiany
Przed programem .NET Core 3.0, jeśli dla elementu w pliku projektu nie LogicalName
określono EmbeddedResource
żadnych metadanych lub DependentUpon
, ManifestResourceName
program MSBuild wygenerował nazwę pliku manifestu we wzorcu <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
. Jeśli RootNamespace
plik projektu nie jest zdefiniowany, wartość domyślna to nazwa projektu. Na przykład wygenerowana nazwa manifestu dla pliku zasobu o nazwie Form1.resx w katalogu głównym projektu to MyProject.Form1.resources.
Począwszy od platformy .NET Core 3.0, jeśli plik zasobu jest kolokowany 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 to MyNamespace.Form1.resources. Należy pamiętać, że pierwsza część nazwy pliku różni się od wcześniejszych wersji platformy .NET Core (MyNamespace zamiast MyProject).
Uwaga
Jeśli masz LogicalName
metadane , 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 dodatkami EmbeddedResourceUseDependentUponConvention
właściwości do projektów platformy .NET Core. Domyślnie pliki zasobów nie są jawnie wyświetlane w pliku projektu platformy .NET Core, dlatego nie DependentUpon
mają żadnych metadanych, aby określić, jak nazwać wygenerowany plik resources . Gdy EmbeddedResourceUseDependentUponConvention
jest ustawiona wartość 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 ustawiono EmbeddedResourceUseDependentUponConvention
false
wartość , program MSBuild generuje 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ć. Jeśli jednak ta zmiana ulegnie awarii aplikacji, możesz wykonać następujące czynności:
Zmień kod, aby oczekiwał nowej nazwy manifestu.
Zrezygnuj z nowej konwencji nazewnictwa, ustawiając wartość
EmbeddedResourceUseDependentUponConvention
nafalse
w pliku projektu.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Kategoria
MSBuild
Dotyczy interfejsów API
Nie dotyczy
Sieć
.NET Core 2.0
Program WebClient.CancelAsync nie zawsze anuluje natychmiast
Począwszy od platformy .NET Core 2.0, wywołanie WebClient.CancelAsync() nie anuluje żądania natychmiast, jeśli odpowiedź zaczęła pobierać.
Opis zmiany
Wcześniej wywołanie WebClient.CancelAsync() anulowało żądanie natychmiast. Począwszy od platformy .NET Core 2.0, wywołanie WebClient.CancelAsync() metody anuluje żądanie natychmiast tylko wtedy, gdy odpowiedź nie została uruchomiona do pobrania. Jeśli odpowiedź została uruchomiona do pobrania, żądanie zostanie anulowane dopiero po przeczytaniu pełnej odpowiedzi.
Ta zmiana została zaimplementowana, ponieważ WebClient interfejs API jest przestarzały na rzecz .HttpClient
Wprowadzona wersja
2.0
Zalecana akcja
System.Net.Http.HttpClient Użyj klasy zamiast System.Net.WebClient, która jest przestarzała.
Kategoria
Sieć
Dotyczy interfejsów API
Windows Forms
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 formatowania komórek nie jest zgłaszane, jeśli jest wyświetlana etykietka narzędzia
- Control.DefaultFont został zmieniony na Segoe UI 9 pkt
- Modernizacja folderuBrowserDialog
- SerializableAttribute usunięto z niektórych typów formularzy systemu Windows
- Przełącznik zgodności AllowUpdateChildControlIndexForTabControls nie jest obsługiwany
- DomainUpDown.UseLegacyScrolling— przełącznik zgodności 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 i SplashScreen są uszkodzone dla języka Visual Basic
- Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices są niedostępne
- Typy w przestrzeni nazw Microsoft.VisualBasic.Devices są niedostępne
- Typy w przestrzeni nazw Microsoft.VisualBasic.MyServices są niedostępne
.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.
Opis zmiany
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 | Skojarzone interfejsy API, które są usuwane |
---|---|---|
ContextMenu | ContextMenuStrip | |
DataGrid | Datagridview | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
Mainmenu | MenuStrip | |
Menu | ToolStripDropDown, ToolStripDropDownMenu | Menuitemcollection |
MenuItem | Toolstripmenuitem | |
ToolBar | ToolStrip | ToolBarAppearance |
Toolbarbutton | Toolstripbutton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Kategoria
Windows Forms
Dotyczy interfejsów API
- 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
Element DataGridView zawiera teraz tekst komórki i etykietki narzędzi błędów po umieszczeniu wskaźnika myszy i wybraniu za pomocą klawiatury. Jeśli zostanie wyświetlona etykietka narzędzia, DataGridView.CellFormatting zdarzenie nie zostanie zgłoszone.
Opis zmiany
Przed platformą .NET Core 3.1 właściwość, DataGridView która miała ShowCellToolTips ustawioną właściwość, wyświetlała true
etykietkę narzędzia dla tekstu komórki i błędy, gdy komórka została zatrzymana myszą. Etykietki narzędzi nie były wyświetlane, gdy komórka została wybrana za pomocą klawiatury (na przykład za pomocą klawisza Tab, klawiszy skrótów lub nawigacji strzałką). Jeśli użytkownik edytował komórkę, a następnie, gdy DataGridView był nadal w trybie edycji, zatrzymał wskaźnik myszy na komórce, która nie ma ToolTipText zestawu właściwości, CellFormatting zdarzenie zostało zgłoszone w celu sformatowania tekstu komórki do wyświetlenia w komórce.
Aby spełnić standardy ułatwień dostępu, począwszy od platformy .NET Core 3.1, właściwość, która ma ShowCellToolTips ustawioną właściwość , wyświetla true
etykietki narzędzi dla tekstu komórki i błędy nie tylko wtedy, DataGridView gdy komórka zostanie zatrzymana, ale także po jej wybraniu za pomocą klawiatury. W wyniku tej zmiany zdarzenie nie jest wywoływane, CellFormatting gdy komórki, które nie mają ToolTipText zestawu właściwości, są najechane, gdy DataGridView obiekt jest w trybie edycji. Zdarzenie nie jest wywoływane, ponieważ zawartość zatrzymanej komórki jest wyświetlana jako etykietka narzędzia, a nie wyświetlana w komórce.
Wprowadzona wersja
3.1
Zalecana akcja
Refaktoryzuj dowolny kod, który zależy od CellFormatting zdarzenia, gdy DataGridView element jest w trybie edycji.
Kategoria
Windows Forms
Dotyczy interfejsów API
Brak
.NET Core 3.0
Domyślna czcionka kontrolki została zmieniona na Segoe UI 9 pkt
Opis zmiany
W programie .NET Framework właściwość została ustawiona Control.DefaultFont 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ększy, 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.
Wprowadzona wersja
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
ApplicationDefaultFont
właściwość 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 polecenie 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
- Windows Forms
Dotyczy interfejsów API
Brak.
Modernizacja folderuBrowserDialog
Kontrolka FolderBrowserDialog zmieniła się w aplikacjach Windows Forms dla platformy .NET Core.
Opis zmiany
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 FolderBrowserDialog.AutoUpgradeEnabled właściwość na wartość false
przed wyświetleniem okna dialogowego, jak pokazano na poniższym fragmentze kodu:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Kategoria
Windows Forms
Dotyczy interfejsów API
SerializableAttribute usunięto z niektórych typów formularzy systemu Windows
Element SerializableAttribute został usunięty z niektórych klas windows Forms, które nie mają znanych scenariuszy serializacji binarnej.
Opis zmiany
Następujące typy są ozdobione elementem SerializableAttribute w programie .NET Framework, ale atrybut został usunięty na platformie .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. Obsługa SerializableAttribute
typów oznacza, że te typy muszą być testowane pod kątem zmian serializacji od wersji do wersji i potencjalnie zmian serializacji struktury do struktury. 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.
Wprowadzona wersja
3.0
Zalecana akcja
Zaktualizuj dowolny kod, który może zależeć od tych typów oznaczonych jako możliwe do serializacji.
Kategoria
Windows Forms
Dotyczy interfejsów API
- Brak
Przełącznik zgodności AllowUpdateChildControlIndexForTabControls nie jest obsługiwany
Przełącznik Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
zgodności jest obsługiwany w formularzach systemu Windows 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.
Opis zmiany
W programie .NET Framework 4.6 lub nowszym wybierz kartę zmień kolejność kolekcji kontrolek. Przełącznik Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
zgodności umożliwia aplikacji pomijanie tej zmiany kolejności, gdy to zachowanie jest niepożądane.
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
przełącznik 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
Windows Forms
Dotyczy interfejsów API
- Brak
DomainUpDown.UseLegacyScrolling— przełącznik zgodności nie jest obsługiwany
Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
Przełącznik zgodności, który został wprowadzony w programie .NET Framework 4.7.1, nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 lub nowszym.
Opis zmiany
Począwszy od programu .NET Framework 4.7.1, Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
przełącznik zgodności umożliwia deweloperom rezygnację z niezależnych DomainUpDown.DownButton() i DomainUpDown.UpButton() akcji. Przełącznik przywrócił starsze zachowanie, w którym DomainUpDown.UpButton() element jest ignorowany, jeśli tekst kontekstowy jest obecny, a deweloper musi używać DomainUpDown.DownButton() akcji w kontrolce przed akcją DomainUpDown.UpButton() . Aby uzyskać więcej informacji, zobacz Element AppContextSwitchOverrides>.<
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
przełącznik 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
Windows Forms
Dotyczy interfejsów API
Przełącznik zgodności DoNotLoadLatestRichEditControl nie jest obsługiwany
Switch.System.Windows.Forms.UseLegacyImages
Przełącznik zgodności, który został wprowadzony w programie .NET Framework 4.7.1, nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 lub nowszym.
Opis zmiany
W programie .NET Framework 4.6.2 i poprzednich wersjach RichTextBox kontrolka tworzy wystąpienie kontrolki Win32 RichEdit w wersji 3.0 oraz dla aplikacji przeznaczonych dla programu .NET Framework 4.7.1 RichTextBox kontrolka tworzy wystąpienie biblioteki RichEdit w wersji 4.1 (w msftedit.dll). Przełącznik Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
zgodności został wprowadzony w celu umożliwienia aplikacjom przeznaczonym dla programu .NET Framework 4.7.1 i nowszych wersji, aby zrezygnować z nowej kontrolki RichEdit w wersji 4.1 i użyć starej kontrolki RichEdit w wersji 3.
W wersjach .NET Core i .NET 5.0 i nowszych Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
przełącznik 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
Windows Forms
Dotyczy interfejsów API
Przełącznik zgodności DoNotSupportSelectAllShortcutInMultilineTextBox nie jest obsługiwany
Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
Przełącznik zgodności, 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.
Opis zmiany
Począwszy od programu .NET Framework 4.6.1, wybierając klawisz skrótu Ctrl + A w kontrolce zaznaczony TextBox cały tekst. W programie .NET Framework 4.6 i poprzednich wersjach wybranie klawisza skrótu Ctrl + A nie powiodło się, aby zaznaczyć cały tekst, jeśli pole tekstowe.ShortcutsEnabled i TextBox.Multiline właściwości zostały ustawione na true
wartość . Przełącznik Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
zgodności 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 Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
przełącznik 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
Windows Forms
Dotyczy interfejsów API
- Brak
Przełącznik zgodności DontSupportReentrantFilterMessage nie jest obsługiwany
Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
Przełącznik zgodności, 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.
Opis zmiany
Począwszy od programu .NET Framework 4.6.1, Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
przełącznik zgodności rozwiązuje możliwe IndexOutOfRangeException wyjątki, gdy Application.FilterMessage komunikat jest wywoływany z implementacją niestandardową IMessageFilter.PreFilterMessage . Aby uzyskać więcej informacji, zobacz Środki zaradcze: Niestandardowe implementacje IMessageFilter.PreFilterMessage.
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
przełącznik 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
Windows Forms
Dotyczy interfejsów API
Przełącznik zgodności EnableVisualStyleValidation nie jest obsługiwany
Switch.System.Windows.Forms.EnableVisualStyleValidation
Przełącznik zgodności nie jest obsługiwany w aplikacjach Windows Forms na platformie .NET Core lub .NET 5.0 i nowszych wersjach.
Opis zmiany
W programie .NET Framework Switch.System.Windows.Forms.EnableVisualStyleValidation
przełącznik zgodności zezwolił aplikacji na rezygnację ze sprawdzania poprawności stylów wizualizacji podanych w postaci liczbowej.
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.EnableVisualStyleValidation
przełącznik 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
Windows Forms
Dotyczy interfejsów API
- Brak
Przełącznik zgodności UseLegacyContextMenuStripSourceControlValue nie jest obsługiwany
Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
Przełącznik zgodności 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.
Opis zmiany
Począwszy od programu .NET Framework 4.7.2, Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
przełącznik zgodności umożliwia deweloperowi rezygnację z nowego zachowania ContextMenuStrip.SourceControl właściwości, która teraz zwraca odwołanie do kontroli źródła. Poprzednie zachowanie właściwości miało zwrócić wartość null
. Aby uzyskać więcej informacji, zobacz Element AppContextSwitchOverrides>.<
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
przełącznik 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
Windows Forms
Dotyczy interfejsów API
Przełącznik zgodności UseLegacyImages nie jest obsługiwany
Switch.System.Windows.Forms.UseLegacyImages
Przełącznik zgodności wprowadzony w programie .NET Framework 4.8 nie jest obsługiwany w programie Windows Forms na platformie .NET Core lub .NET 5.0 lub nowszym.
Opis zmiany
Począwszy od programu .NET Framework 4.8, Switch.System.Windows.Forms.UseLegacyImages
przełącznik zgodności rozwiązał możliwe problemy ze skalowaniem obrazów w scenariuszach technologii ClickOnce w środowiskach o wysokiej rozdzielczości DPI. Po ustawieniu true
wartości 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 Informacje o wersji programu .NET Framework 4.8 w witrynie GitHub.
W programach .NET Core i .NET 5.0 lub nowszych Switch.System.Windows.Forms.UseLegacyImages
przełącznik 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
Windows Forms
Dotyczy interfejsów API
- Brak
Szablony About i SplashScreen są uszkodzone
Pliki About.vb
i SplashScreen.vb
generowane przez program Visual Studio zawierają odwołania do typów w My
przestrzeni nazw, które nie są dostępne .NET Core 3.0 i 3.1.
Wprowadzona wersja
3.0
Opis zmiany
Programy .NET Core 3.0 i 3.1 nie zawierają pełnej obsługi języka Visual Basic My
. Szablony formularzy About and SplashScreen w programie Visual Studio dla aplikacji Visual Basic Windows Forms odwołują się do właściwości typówMy.Application.Info
, które nie są dostępne.
Zalecana akcja
Ulepszono obsługę języka Visual Basic My
na platformie .NET 5, uaktualnij projekt do platformy .NET 5 lub nowszej.
— lub —
Napraw błędy kompilatora w typach About i SplashScreen w aplikacji. System.Reflection.Assembly
Użyj klasy , aby uzyskać informacje podane przez My.Application.Info
typ. 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.
Informacje
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
Splashscreen
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
Dotyczy interfejsów API
Brak
Typy w przestrzeni nazw Microsoft.VisualBasic.ApplicationServices są niedostępne
Typy w Microsoft.VisualBasic.ApplicationServices przestrzeni nazw nie są dostępne.
Wprowadzona wersja
.NET Core 3.0
Opis zmiany
Typy w Microsoft.VisualBasic.ApplicationServices przestrzeni nazw 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 Microsoft.VisualBasic.ApplicationServices typów 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 elementy i System.Security.Principal.WindowsIdentity składowe zapewniają równoważne funkcje właściwościom Microsoft.VisualBasic.ApplicationServices.User klasy.
Kategoria
Visual Basic
Dotyczy interfejsów API
Typy w przestrzeni nazw Microsoft.VisualBasic.Devices są niedostępne
Typy w Microsoft.VisualBasic.Devices przestrzeni nazw nie są dostępne.
Wprowadzona wersja
.NET Core 3.0
Opis zmiany
Typy w Microsoft.VisualBasic.Devices przestrzeni nazw 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 Microsoft.VisualBasic.Devices typów i ich składowych, możesz użyć odpowiedniego typu lub elementu członkowskiego w bibliotece klas platformy .NET. Na przykład równoważna Microsoft.VisualBasic.Devices.Clock funkcjonalność klasy jest dostarczana przez System.DateTime typy i System.Environment , a równoważne funkcje Microsoft.VisualBasic.Devices.Ports dla klasy są udostępniane przez typy w System.IO.Ports przestrzeni nazw.
Kategoria
Visual Basic
Dotyczy interfejsów API
Typy w przestrzeni nazw Microsoft.VisualBasic.MyServices są niedostępne
Typy w Microsoft.VisualBasic.MyServices przestrzeni nazw nie są dostępne.
Wprowadzona wersja
.NET Core 3.0
Opis zmiany
Typy w Microsoft.VisualBasic.MyServices przestrzeni nazw 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 twój kod zależy od użycia typów Microsoft.VisualBasic.MyServices i ich elementów członkowskich, istnieją odpowiednie typy i składowe w bibliotece klas platformy .NET. Poniżej przedstawiono mapowanie typów Microsoft.VisualBasic.MyServices na równoważne typy bibliotek klas platformy .NET:
Microsoft.VisualBasic.MyServices, typ | Typ biblioteki klas platformy .NET |
---|---|
ClipboardProxy | System.Windows.Clipboard dla aplikacji WPF dla aplikacji System.Windows.Forms.Clipboard Windows Forms |
FileSystemProxy | Typy w System.IO przestrzeni nazw |
RegistryProxy | Typy związane z rejestrem Microsoft.Win32 w przestrzeni nazw |
SpecialDirectoriesProxy | Environment.GetFolderPath |
Kategoria
Visual Basic