Критические изменения для миграции с .NET Framework на .NET Core
Если вы переносите приложение из .NET Framework в .NET Core версии 1.0 до 3.1, критические изменения, перечисленные в этой статье, могут повлиять на вас. Критические изменения группируются по категориям и в этих категориях по версии .NET Core, в которой они были введены.
Заметка
Эта статья не является полным списком важных изменений между .NET Framework и .NET Core. Наиболее важные критические изменения добавляются здесь, как мы узнаем о них.
Основные библиотеки .NET
- Изменение значения по умолчанию UseShellExecute
- API IDispatchImplAttribute удален
- UnauthorizedAccessException, вызванное FileSystemInfo.Attributes
- Обработка исключений поврежденного состояния процесса не поддерживается
- свойства UriBuilder больше не предоставляют ведущих символов
- Process.StartInfo создает исключение InvalidOperationException для процессов, которые не были запущены
.NET 8
Атрибут IDispatchImplAttribute API удален
.NET Core 2.1
Изменение значения по умолчанию UseShellExecute
ProcessStartInfo.UseShellExecute имеет значение по умолчанию false
в .NET Core. В .NET Framework значение по умолчанию — true
.
Изменение описания
Process.Start позволяет запускать приложение напрямую, например с помощью кода, например Process.Start("mspaint.exe")
, запускающего Paint. Он также позволяет запускать связанное приложение косвенно, если ProcessStartInfo.UseShellExecute имеет значение true
. В .NET Framework значение по умолчанию для ProcessStartInfo.UseShellExecute равно true
, что означает, что код, например, Process.Start("mytextfile.txt")
, запустит Блокнот, если вы связали файлы .txt с этим редактором. Чтобы предотвратить косвенный запуск приложения в .NET Framework, необходимо явно задать ProcessStartInfo.UseShellExecute на false
. В .NET Core значение по умолчанию для ProcessStartInfo.UseShellExecute равно false
. Это означает, что по умолчанию связанные приложения не запускаются при вызове Process.Start
.
Следующие свойства System.Diagnostics.ProcessStartInfo работают только в том случае, если ProcessStartInfo.UseShellExecutetrue
:
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
Это изменение было введено в .NET Core по соображениям производительности. Как правило, Process.Start используется для запуска приложения напрямую. Прямой запуск приложения не обязательно включает оболочку Windows и связанные с этим потери в производительности. Чтобы сделать этот вариант по умолчанию быстрее, .NET Core изменяет значение по умолчанию ProcessStartInfo.UseShellExecute на false
. Вы можете выбрать более медленный путь, если это необходимо.
Представленная версия
2.1
Заметка
В более ранних версиях .NET Core UseShellExecute
не был реализован для Windows.
Рекомендуемое действие
Если ваше приложение использует старое поведение, вызовите Process.Start(ProcessStartInfo) с параметром UseShellExecute, установленным в true
, для объекта ProcessStartInfo.
Категория
Основные библиотеки .NET
Затронутые API
.NET Core 1.0
Исключение UnauthorizedAccessException, вызванное FileSystemInfo.Attributes
В .NET Core UnauthorizedAccessException возникает, когда вызывающий пытается задать значение атрибута файла, но не имеет разрешения на запись.
Изменение описания
В .NET Framework возникает ArgumentException, когда вызывающий пытается задать значение атрибута файла в FileSystemInfo.Attributes, но не имеет разрешения на запись. В .NET Core вместо этого выбрасывается UnauthorizedAccessException. (В .NET Core ArgumentException по-прежнему возникает, если вызывающий объект пытается задать недопустимый атрибут файла.)
Представленная версия
1.0
Рекомендуемое действие
При необходимости измените все операторы catch
, чтобы поймать UnauthorizedAccessException вместо или в дополнение к ArgumentException.
Категория
Основные библиотеки .NET
Затронутые API
Обработка исключений, связанных с повреждением состояния, не поддерживается
Обработка исключений поврежденного состояния процесса в .NET Core не поддерживается.
Изменение описания
Ранее исключения поврежденного состояния процесса могут быть пойманы и обрабатываются обработчиками исключений управляемого кода, например с помощью инструкции try-catch в C#.
Начиная с .NET Core 1.0 исключения поврежденного состояния процесса не могут обрабатываться управляемым кодом. Общая среда выполнения (CLR) не передает исключения, связанные с поврежденным состоянием процесса, в управляемый код.
Представленная версия
1.0
Рекомендуемое действие
Избегайте необходимости обрабатывать исключения состояния поврежденного процесса, устраняя ситуации, которые приводят к ним. Если для обработки исключений, связанных с поврежденным состоянием процесса, абсолютно необходимо, напишите обработчик исключений в коде C или C++.
Категория
Основные библиотеки .NET
Затронутые API
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- элемент legacyCorruptedStateExceptionsPolicy
Свойства UriBuilder больше не добавляют ведущие символы
UriBuilder.Fragment больше не предваряет символ #
и UriBuilder.Query больше не предваряет символ ?
, когда он уже присутствует.
Изменение описания
В .NET Framework свойства UriBuilder.Fragment и UriBuilder.Query всегда предваряются соответственно символом #
или ?
к хранимому значению. Это может привести к нескольким #
или ?
символам в сохраненном значении, если строка уже содержит один из этих ведущих символов. Например, значение UriBuilder.Fragment может стать ##main
.
Начиная с .NET Core 1.0, эти свойства больше не добавляют в начало символы #
или ?
к значению в хранилище, если они уже присутствуют в начале строки.
Представленная версия
1.0
Рекомендуемое действие
При задании значений свойств больше не нужно явно удалять любые из этих ведущих символов. Это особенно полезно при добавлении значений, так как вам больше не нужно удалять начальные #
или ?
каждый раз при добавлении.
Например, в следующем фрагменте кода показано различие поведения между .NET Framework и .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);
- В .NET Framework результат
????one=1&two=2&three=3&four=4
. - В .NET Core результат -
?one=1&two=2&three=3&four=4
.
Категория
Основные библиотеки .NET
Затронутые API
Process.StartInfo создает исключение InvalidOperationException для процессов, которые не были запущены
Чтение свойства Process.StartInfo для процессов, которые ваш код не запускал, выдаёт InvalidOperationException.
Изменение описания
В .NET Framework доступ к свойству Process.StartInfo для процессов, которые код не начал, возвращает фиктивный объект ProcessStartInfo. Фиктивный объект содержит значения по умолчанию для всех его свойств, кроме EnvironmentVariables.
Начиная с .NET Core 1.0, если вы считываете свойство Process.StartInfo для процесса, который вы не запустили (например, вызвав Process.Start), выбрасывается исключение InvalidOperationException.
Представленная версия
1.0
Рекомендуемое действие
Не получайте доступ к свойству Process.StartInfo для процессов, которые не были запущены вашим кодом. Например, не считывайте это свойство для процессов, которые возвращает Process.GetProcesses.
Категория
Основные библиотеки .NET
Затронутые API
Криптография
.NET Core 2.1
Булевый параметр SignedCms.ComputeSignature учитывается
В .NET Core логический параметр silent
метода SignedCms.ComputeSignature(CmsSigner, Boolean) соблюдается. Запрос ПИН-кода не отображается, если для этого параметра задано значение true
.
Изменение описания
В .NET Framework параметр silent
метода SignedCms.ComputeSignature(CmsSigner, Boolean) игнорируется, а окно ввода PIN-кода всегда запрашивается, если это требует поставщик. В .NET Core параметр silent
соблюдается, и если задано значение true
, запрос PIN-кода никогда не отображается, даже если он требуется поставщиком.
Поддержка сообщений CMS/PKCS #7 была введена в .NET Core в версии 2.1.
Представленная версия
2.1
Рекомендуемое действие
Чтобы запрос ПИН-кода появлялся при необходимости, настольные приложения должны вызывать SignedCms.ComputeSignature(CmsSigner, Boolean) и устанавливать логический параметр false
. Результирующее поведение совпадает с поведением в .NET Framework независимо от того, отключен ли там тихий контекст.
Категория
Криптография
Затронутые API
MSBuild
.NET Core 3.0
Изменение имени файла манифеста ресурса
Начиная с .NET Core 3.0, в случае по умолчанию MSBuild создает другое имя файла манифеста для файлов ресурсов.
Представленная версия
3.0
Изменение описания
До .NET Core 3.0, если метаданные LogicalName
, ManifestResourceName
или DependentUpon
не были указаны для элемента EmbeddedResource
в файле проекта, MSBuild генерировал имя файла манифеста по шаблону <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
. Если RootNamespace
не определен в файле проекта, по умолчанию используется имя проекта. Например, созданное имя манифеста для файла ресурсов Form1.resx в корневом каталоге проекта было MyProject.Form1.resources.
Начиная с .NET Core 3.0, если файл ресурса находится вместе с исходным файлом того же имени (например, Form1.resx и Form1.cs), MSBuild использует сведения о типе из исходного файла для создания имени файла манифеста в шаблоне <Namespace>.<ClassName>.resources
. Пространство имен и имя класса извлекаются из первого типа в исходном файле. Например, созданное имя манифеста для файла ресурсов с именем Form1.resx, который расположен вместе с исходным файлом с именем Form1.cs, будет MyNamespace.Form1.resources. Важно отметить, что первая часть имени файла отличается от предыдущих версий .NET Core (MyNamespace вместо MyProject).
Заметка
Если у вас есть LogicalName
, ManifestResourceName
или DependentUpon
метаданные, указанные в элементе EmbeddedResource
в файле проекта, это изменение не влияет на этот файл ресурсов.
Это критическое изменение было введено с добавлением свойства EmbeddedResourceUseDependentUponConvention
в проекты .NET Core. По умолчанию файлы ресурсов не указаны явным образом в файле проекта .NET Core, поэтому у них нет метаданных DependentUpon
, чтобы указать имя созданного .resources файла. Если для параметра EmbeddedResourceUseDependentUponConvention
установлено значение true
, что является значением по умолчанию, MSBuild ищет исходный файл в том же месте и извлекает пространство имен и имя класса из этого файла. Если вы установите EmbeddedResourceUseDependentUponConvention
на false
, MSBuild создаст имя манифеста в соответствии с предыдущим поведением, которое объединяет RootNamespace
и относительный путь к файлу.
Рекомендуемое действие
В большинстве случаев никаких действий не требуется от части разработчика, и ваше приложение должно продолжать работать. Однако, если это изменение выводит ваше приложение из строя, вы можете либо:
Измените код, чтобы учитывать новое имя манифеста.
Откажитесь от нового соглашения об именовании, изменив значение с
EmbeddedResourceUseDependentUponConvention
наfalse
в файле проекта.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Категория
MSBuild
Затронутые API
N/A
Сети
.NET Core 2.0
WebClient.CancelAsync не всегда отменяет немедленно
Начиная с .NET Core 2.0, вызов WebClient.CancelAsync() не отменяет запрос немедленно, если начато получение ответа.
Изменение описания
Ранее при вызове WebClient.CancelAsync() запрос немедленно отменялся. Начиная с .NET Core 2.0, вызов WebClient.CancelAsync() немедленно отменяет запрос, только если процесс получения ответа еще не начался. Если загрузка ответа началась, запрос отменяется только после полной его обработки.
Это изменение было реализовано, так как API WebClient не рекомендуется использовать в пользу HttpClient.
Представленная версия
2.0
Рекомендуемое действие
Используйте класс System.Net.Http.HttpClient вместо System.Net.WebClient, который не рекомендуется.
Категория
Сети
Затронутые API
Windows Forms
Поддержка Windows Forms была добавлена в .NET Core версии 3.0. Если вы переносите приложение Windows Forms из .NET Framework в .NET Core, критические изменения, перечисленные здесь, могут повлиять на ваше приложение.
- Удаленные элементы управления
- Событие CellFormatting не вызывается, если отображается подсказка
- Control.DefaultFont изменилось на Segoe UI 9 pt
- Модернизация диалога выбора папки
- Атрибут SerializableAttribute удалён из некоторых типов Windows Forms
- Параметр совместимости "AllowUpdateChildControlIndexForTabControls" не поддерживается
- переключатель совместимости DomainUpDown.UseLegacyScrolling не поддерживается
- параметр совместимости DoNotLoadLatestRichEditControl не поддерживается
- параметр совместимости DoNotSupportSelectAllShortcutInMultilineTextBox не поддерживается
- параметр совместимости DontSupportReentrantFilterMessage не поддерживается
- Переключатель совместимости EnableVisualStyleValidation не поддерживается
- параметр совместимости UseLegacyContextMenuStripSourceControlValue не поддерживается
- переключатель совместимости UseLegacyImages не поддерживается
- Шаблоны "О программе" и "Заставка" не работают для Visual Basic
- Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices недоступны
- Типы из пространства имен Microsoft.VisualBasic.Devices недоступны
- Типы в пространстве имен Microsoft.VisualBasic.MyServices недоступны
.NET Core 3.1
Удаленные элементы управления
Начиная с .NET Core 3.1 некоторые элементы управления Windows Forms больше не доступны.
Изменение описания
Начиная с .NET Core 3.1 различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 появились элементы управления заменой, которые имеют лучшую структуру и поддержку. Устаревшие элементы управления ранее были удалены из дизайнерских инструментов, но по-прежнему доступны для использования.
Следующие типы больше не доступны:
- 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
Представленная версия
3.1
Рекомендуемое действие
Каждый удаленный элемент управления имеет рекомендуемый альтернативный элемент управления. См. следующую таблицу:
Удален элемент управления (API) | Рекомендуемая замена | Связанные API, которые удалены |
---|---|---|
контекстное меню | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
Главное меню | MenuStrip | |
Меню | ToolStripDropDown, ToolStripDropDownMenu | КоллекцияПунктовМеню |
Элемент меню | ToolStripMenuItem | |
Панель инструментов | Панель инструментов (ToolStrip) | Вид панели инструментов |
КнопкаПанелиИнструментов | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Категория
Windows Forms
Затронутые 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
Событие CellFormatting не вызывается, если отображается подсказка
Теперь DataGridView отображает текст ячейки и всплывающие подсказки об ошибках при наведении мыши и выборе с помощью клавиатуры. Если отображается подсказка, событие DataGridView.CellFormatting не вызывается.
Изменение описания
До .NET Core 3.1 DataGridView со свойством ShowCellToolTips, установленным в true
, отображал подсказку для текста и ошибок ячейки при наведении указателя мыши. Подсказки не отображались при выборе ячейки с помощью клавиатуры (например, с помощью клавиши TAB, сочетания клавиш или навигации со стрелками). Если пользователь редактировал ячейку, а затем, пока DataGridView все еще находится в режиме редактирования, наведя указатель мыши на ячейку, у которой не установлено свойство ToolTipText, появляется событие CellFormatting для форматирования текста ячейки.
Чтобы соответствовать стандартам специальных возможностей, начиная с .NET Core 3.1, DataGridView с свойством ShowCellToolTips, установленным для true
, отображаются подсказки для текста и ошибок ячейки не только при наведении указателя на ячейку, но и при выборе с помощью клавиатуры. В результате этого изменения событие CellFormattingне возникает, когда наводят указатель мыши на ячейки, у которых свойство ToolTipText не установлено, в то время как DataGridView находится в режиме правки. Событие не вызывается, так как содержимое наведенной ячейки отображается как подсказка, а не отображается в ячейке.
Представленная версия
3.1
Рекомендуемое действие
Перепишите любой код, зависящий от события CellFormatting, пока DataGridView находится в режиме редактирования.
Категория
Windows Forms
Затронутые API
Никакой
.NET Core 3.0
Шрифт элемента управления по умолчанию изменен на Segoe UI 9 pt
Изменение описания
В .NET Framework для свойства Control.DefaultFont задано значение Microsoft Sans Serif 8.25 pt
. На следующем рисунке показано окно, использующее шрифт по умолчанию.
шрифт элемента управления по умолчанию
Начиная с .NET Core 3.0 шрифт по умолчанию имеет значение Segoe UI 9 pt
(тот же шрифт, что и SystemFonts.MessageBoxFont). В результате этого изменения формы и элементы управления увеличены примерно на 27%, чтобы соответствовать большему размеру нового шрифта по умолчанию. Например:
.NET Core
Это изменение было внесено в соответствие с рекомендациями пользовательского интерфейса Windows.
Представленная версия
3.0
Рекомендуемое действие
Из-за изменения размера форм и элементов управления проследите, чтобы ваше приложение корректно отображалось.
Чтобы сохранить исходный шрифт для одной формы, задайте для его шрифта по умолчанию значение Microsoft Sans Serif 8.25 pt
. Например:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
Кроме того, можно изменить шрифт по умолчанию для всего приложения следующим образом:
Присвойв свойству MSBuild
ApplicationDefaultFont
значение "Microsoft Sans Serif, 8.25pt". Это предпочтительный способ, так как он позволяет Visual Studio использовать новые параметры в конструкторе.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>
При вызове 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()); } }
Категория
- Windows Forms
Затронутые API
Нет.
Модернизация диалога выбора папки
Элемент управления FolderBrowserDialog изменился в приложениях Windows Forms для .NET Core.
Изменение описания
В .NET Framework Windows Forms использует следующее диалоговое окно для элемента управления FolderBrowserDialog:
В .NET Core 3.0 Windows Forms использует более новый COM-элемент управления, который был введён в Windows Vista:
Представленная версия
3.0
Рекомендуемое действие
Диалоговое окно будет автоматически обновлено.
Если вы хотите сохранить исходное диалоговое окно, задайте для свойства FolderBrowserDialog.AutoUpgradeEnabled значение false
перед отображением диалогового окна, как показано в следующем фрагменте кода:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Категория
Windows Forms
Затронутые API
SerializableAttribute удален из некоторых типов Windows Forms
SerializableAttribute удалены из некоторых классов Windows Forms, которые не имеют известных сценариев двоичной сериализации.
Изменение описания
Следующие типы украшены SerializableAttribute в .NET Framework, но атрибут был удален в .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
Исторически этот механизм сериализации имел серьезные проблемы с обслуживанием и безопасностью. Поддержание SerializableAttribute
в типах означает, что эти типы должны быть проверены на изменения сериализации от версии к версии и потенциально от фреймворка к фреймворку. Это затрудняет развитие этих типов и может быть дорогостоящим для обслуживания. Эти типы не имеют известных сценариев двоичной сериализации, что сводит к минимуму влияние удаления атрибута.
Более подробную информацию см. в о двоичной сериализации.
Представленная версия
3.0
Рекомендуемое действие
Обновите любой код, который может зависеть от этих типов, помеченных как сериализуемый.
Категория
Windows Forms
Затронутые API
- Никакой
Параметр совместимости AllowUpdateChildControlIndexForTabControls не поддерживается
Параметр совместимости Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
поддерживается в Windows Forms в .NET Framework 4.6 и более поздних версиях, но не поддерживается в .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
В .NET Framework 4.6 и более поздних версиях выбор вкладки приводит к переупорядочиванию коллекции элементов управления. Параметр совместимости Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
позволяет приложению пропускать этот переупорядочение, если это поведение нежелательно.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, а альтернативные функции недоступны.
Категория
Windows Forms
Затронутые API
- Никакой
Параметр совместимости DomainUpDown.UseLegacyScrolling не поддерживается
Параметр совместимости Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
, представленный в .NET Framework 4.7.1, не поддерживается в Windows Forms в .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
Начиная с .NET Framework 4.7.1, параметр совместимости Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
позволил разработчикам отказаться от независимых DomainUpDown.DownButton() и DomainUpDown.UpButton() действий. Параметр восстановил устаревшее поведение, в котором DomainUpDown.UpButton() игнорируется, если присутствует контекстный текст, и разработчику необходимо использовать действие DomainUpDown.DownButton() на элементе управления перед выполнением действия DomainUpDown.UpButton(). Дополнительные сведения см. в элементе <AppContextSwitchOverrides>.
В .NET Core и .NET 5.0 и более поздних версиях переключатель Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и альтернативной функциональности нет.
Категория
Windows Forms
Затронутые API
Переключатель совместимости DoNotLoadLatestRichEditControl не поддерживается
Параметр совместимости Switch.System.Windows.Forms.UseLegacyImages
, представленный в .NET Framework 4.7.1, не поддерживается в Windows Forms в .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
В .NET Framework 4.6.2 и предыдущих версиях элемент управления RichTextBox создает экземпляр элемента управления Win32 RichEdit версии 3.0 и для приложений, предназначенных для .NET Framework 4.7.1, элемент управления RichTextBox создает экземпляр RichEdit версии 4.1 (в msftedit.dll). Параметр совместимости Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
был представлен, чтобы разрешить приложениям, предназначенным для .NET Framework 4.7.1 и более поздних версий, отказаться от нового элемента управления RichEdit версии 4.1 и использовать старый элемент управления RichEdit версии 3.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
не поддерживается. Поддерживаются только новые версии элемента управления RichTextBox.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и никакие альтернативные возможности недоступны.
Категория
Windows Forms
Затронутые API
Переключатель совместимости DoNotSupportSelectAllShortcutInMultilineTextBox не поддерживается
Переключатель совместимости Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
, который был введен в .NET Framework 4.6.1, не поддерживается в Windows Forms на платформах .NET Core и .NET 5.0 и более поздних.
Изменение описания
Начиная с .NET Framework 4.6.1, при нажатии сочетания клавиш Ctrl + A в элементе управления TextBox выделяется весь текст. В .NET Framework 4.6 и предыдущих версиях выбор сочетания клавиш Ctrl + A не удавалось выделить весь текст, если оба свойства Textbox.ShortcutsEnabled и TextBox.Multiline установлены в значение true
. Параметр совместимости Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
появился в .NET Framework 4.6.1 для сохранения исходного поведения. Дополнительные сведения см. в TextBox.ProcessCmdKey.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и альтернативная функциональность недоступна.
Категория
Windows Forms
Затронутые API
- Никакой
Параметр совместимости DontSupportReentrantFilterMessage не поддерживается
Параметр совместимости Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
, который был представлен в .NET Framework 4.6.1, не поддерживается в Windows Forms на .NET Core, .NET 5.0 и более поздних версиях.
Изменение описания
Начиная с .NET Framework 4.6.1, переключатель совместимости Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
управляет возможными исключениями IndexOutOfRangeException при вызове сообщения Application.FilterMessage с пользовательской реализацией IMessageFilter.PreFilterMessage. Дополнительные сведения см. в разделе Устранение рисков: пользовательские реализации IMessageFilter.PreFilterMessage.
В .NET Core и .NET 5.0 и более поздних версиях переключатель Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и альтернативные функции недоступны.
Категория
Windows Forms
Затронутые API
Параметр совместимости EnableVisualStyleValidation не поддерживается
Параметр совместимости Switch.System.Windows.Forms.EnableVisualStyleValidation
не поддерживается в Windows Forms на .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
В .NET Framework параметр совместимости Switch.System.Windows.Forms.EnableVisualStyleValidation
позволил приложению отказаться от проверки визуальных стилей, предоставленных в числовой форме.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.EnableVisualStyleValidation
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и альтернативные функции недоступны.
Категория
Windows Forms
Затронутые API
- Никакой
Параметр совместимости "UseLegacyContextMenuStripSourceControlValue" не поддерживается
Переключатель совместимости Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
, который был введен в .NET Framework 4.7.2, не поддерживается в Windows Forms на .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
Начиная с .NET Framework 4.7.2, параметр совместимости Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
позволяет разработчику отказаться от нового поведения свойства ContextMenuStrip.SourceControl, которое теперь возвращает ссылку на исходный контроль. Предыдущее поведение свойства заключалось в возвращении null
. Дополнительные сведения см. в разделе элемент<AppContextSwitchOverrides>.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и никакая альтернативная функциональность не доступна.
Категория
Windows Forms
Затронутые API
Параметр совместимости UseLegacyImages не поддерживается
Параметр совместимости Switch.System.Windows.Forms.UseLegacyImages
, представленный в .NET Framework 4.8, не поддерживается в Windows Forms в .NET Core или .NET 5.0 и более поздних версиях.
Изменение описания
Начиная с .NET Framework 4.8, параметр совместимости Switch.System.Windows.Forms.UseLegacyImages
устранял возможные проблемы масштабирования изображений в сценариях ClickOnce в средах с высоким уровнем DPI. Если задано значение true
, переключатель позволяет пользователю восстановить устаревшее масштабирование изображений на высоком уровне DPI, масштаб которого имеет значение более 100%. Дополнительные сведения см. в заметках о выпуске .NET Framework 4.8 на GitHub.
В .NET Core и .NET 5.0 и более поздних версиях параметр Switch.System.Windows.Forms.UseLegacyImages
не поддерживается.
Представленная версия
3.0
Рекомендуемое действие
Удалите переключатель. Переключатель не поддерживается, и альтернативная функциональность недоступна.
Категория
Windows Forms
Затронутые API
- Никакой
Шаблоны About и SplashScreen разбиты
Файлы About.vb
и SplashScreen.vb
, созданные Visual Studio, содержат ссылки на типы в пространстве имен My
, которые недоступны для .NET Core 3.0 и 3.1.
Представленная версия
3.0
Изменение описания
.NET Core 3.0 и 3.1 не содержат полную поддержку My
Visual Basic. Шаблоны форм About и SplashScreen в приложениях Windows Forms на Visual Basic в Visual Studio ссылаются на свойства в типе My.Application.Info
, которые недоступны.
Рекомендуемое действие
Поддержка My
Visual Basic была улучшена в .NET 5, обновите проект до .NET 5 или более поздней версии.
-или-
Исправьте ошибки компилятора в типах About и SplashScreen в вашем приложении. Используйте класс System.Reflection.Assembly
для получения сведений, предоставленных типом My.Application.Info
. Здесь доступен прямой порт обеих форм.
Совет
Это пример кода и неоптимизирован. Список атрибутов должен кэшироваться для уменьшения времени загрузки формы.
о
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
Заставка
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
Категория
Visual Basic Windows Forms
Затронутые API
Никакой
Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices недоступны
Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices недоступны.
Представленная версия
.NET Core 3.0
Изменение описания
Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.
Типы были удалены, чтобы избежать ненужных зависимостей сборки или разрушающих изменений в последующих выпусках.
Рекомендуемое действие
Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.
-или-
Если код зависит от использования типов Microsoft.VisualBasic.ApplicationServices и их членов, вы можете использовать соответствующий тип или член в библиотеке классов .NET. Например, некоторые члены System.Environment и System.Security.Principal.WindowsIdentity предоставляют эквивалентные функциональные возможности свойств класса Microsoft.VisualBasic.ApplicationServices.User.
Категория
Visual Basic
Затронутые API
Типы в пространстве имен Microsoft.VisualBasic.Devices недоступны
Типы в пространстве имен Microsoft.VisualBasic.Devices недоступны.
Представленная версия
.NET Core 3.0
Изменение описания
Типы в пространстве имен Microsoft.VisualBasic.Devices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.
Типы были удалены, чтобы избежать ненужных зависимостей сборки или необратимых изменений в будущих версиях.
Рекомендуемое действие
Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.
-или-
Если код зависит от использования типов Microsoft.VisualBasic.Devices и их членов, вы можете использовать соответствующий тип или член в библиотеке классов .NET. Например, эквивалентные функциональные возможности класса Microsoft.VisualBasic.Devices.Clock предоставляются типами System.DateTime и System.Environment, а эквивалентные функциональные возможности класса Microsoft.VisualBasic.Devices.Ports предоставляются типами в пространстве имен System.IO.Ports.
Категория
Visual Basic
Затронутые API
Типы в пространстве имен Microsoft.VisualBasic.MyServices недоступны
Типы в пространстве имен Microsoft.VisualBasic.MyServices недоступны.
Представленная версия
.NET Core 3.0
Изменение описания
Типы в пространстве имен Microsoft.VisualBasic.MyServices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.
Типы были удалены, чтобы избежать ненужных зависимостей сборки или критических изменений в последующих выпусках.
Рекомендуемое действие
Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.
-или-
Если ваш код основывается на использовании типов Microsoft.VisualBasic.MyServices и их элементов, в библиотеке классов .NET есть соответствующие типы и элементы. Ниже приведено сопоставление типов Microsoft.VisualBasic.MyServices с эквивалентными типами библиотек классов .NET:
Тип Microsoft.VisualBasic.MyServices | Тип библиотеки классов .NET |
---|---|
ClipboardProxy | System.Windows.Clipboard для приложений WPF System.Windows.Forms.Clipboard для приложений Windows Forms |
FileSystemProxy | Типы в пространстве имен System.IO |
RegistryProxy | Типы, связанные с реестром в пространстве имен Microsoft.Win32 |
SpecialDirectoriesProxy | Environment.GetFolderPath |
Категория
Visual Basic
Затронутые API
См. также
- API, которые всегда вызывают исключения в .NET Core
- технологии .NET Framework недоступны в .NET Core