Критические изменения для миграции с .NET Framework на .NET Core

Если вы переносите приложение с .NET Framework на .NET Core версий 1.0–3.1, критические изменения, перечисленные в этой статье, могут повлиять на работу приложения. Критические изменения сгруппированы по категориям, а в этих категориях — по версии .NET Core, в которых они были представлены.

Примечание.

Эта статья не является исчерпывающим списком критических изменений между .NET Framework и .NET Core. Здесь добавляются самые важные критические изменения, как только мы о них узнаем.

Основные библиотеки .NET

.NET 8

API IDispatchImplAttribute удален

.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, необходимо явно установить false на ProcessStartInfo.UseShellExecute. В .NET Core значением по умолчанию для ProcessStartInfo.UseShellExecute является значение false. Это означает, что связанные по умолчанию приложения не запускаются при вызове Process.Start.

Следующие свойства System.Diagnostics.ProcessStartInfo работают только в том случае, если ProcessStartInfo.UseShellExecute имеет значение true:

Это изменение введено в .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


Для свойств 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) игнорируется, и если поставщик этого требует, запрос на ввод ПИН-кода отображается всегда. В .NET Core параметр silent учитывается, и если для него задано значение true, запрос на ввод ПИН-кода никогда не отображается, даже если этого требует поставщик.

В .NET Core в версии 2.1 реализована поддержка сообщений CMS/PKCS #7.

Представленные версии

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, если для элемента EmbeddedResource в файле проекта не были указаны метаданные LogicalName, ManifestResourceNameили DependentUpon, платформа 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).

Примечание.

Если для элемента EmbeddedResource в файле проекта указаны метаданные LogicalName, ManifestResourceName или DependentUpon, это изменение не применяется к соответствующему файлу ресурсов.

Это критическое изменение было введено одновременно с добавлением свойства EmbeddedResourceUseDependentUponConvention для проектов .NET Core. По умолчанию файлы ресурсов не указаны явным образом в файле проекта .NET Core, поэтому в них нет метаданных DependentUpon, которые позволяют задать формат именования созданного файла .resources. Если EmbeddedResourceUseDependentUponConvention имеет значение true (используется по умолчанию), MSBuild ищет в той же папке исходный файл и извлекает из этого файла пространство имен и имя класса. Если для EmbeddedResourceUseDependentUponConvention задано значение false, MSBuild создает имя манифеста по правилам для прежних версий, то есть объединяет RootNamespace и относительный путь к файлу.

В большинстве случаев разработчикам не нужно предпринимать по этому поводу никаких действий, и приложение должно работать нормально. Если же это изменение нарушит работу приложения, вы можете выполнить одно из следующих действий.

  • Измените код так, чтобы он ожидал новое имя манифеста.

  • Откажитесь от нового соглашения об именовании, указав в файле проекта параметр EmbeddedResourceUseDependentUponConvention со значением false.

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

Категория

MSBuild

Затронутые API

Н/П


Сеть

.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, критические изменения, перечисленные здесь, могут повлиять на работу приложения.

.NET Core 3.1.

Удаленные элементы управления

Начиная с .NET Core 3.1, некоторые элементы управления Windows Forms больше не доступны.

Описание изменения

Начиная с .NET Core 3.1, различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.

Следующие типы больше не доступны.

Представленные версии

3.1

Каждый удаленный элемент управления имеет рекомендуемую замену. См. таблицу ниже.

Удаленный элемент управления (API) Рекомендуемая замена Связанные удаленные интерфейсы API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
MainMenu MenuStrip
Меню ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Категория

Windows Forms

Затронутые API


При отображении подсказки не возникает событие 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 пт

Описание изменения

В .NET Framework свойству Control.DefaultFont присвоено значение Microsoft Sans Serif 8 pt. На следующем рисунке показано окно, в котором используется шрифт по умолчанию.

Default control font in .NET Framework

Начиная с .NET Core 3.0 шрифтом по умолчанию является Segoe UI 9 pt (тот же шрифт, что и SystemFonts.MessageBoxFont). В результате этого изменения размер форм и элементов управления увеличен на 27 % с учетом увеличенного размера нового шрифта по умолчанию. Например:

Default control font in .NET Core

Это изменение было внесено в соответствии с рекомендациями по пользовательскому интерфейсу Windows.

Представленные версии

3.0

Так как размер форм и элементов управления изменился, убедитесь, что приложение отображается правильно.

Чтобы оставить исходный шрифт, задайте для формы шрифт по умолчанию: Microsoft Sans Serif 8 pt. Например:

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

Категория

  • Windows Forms

Затронутые API

Нет.


Модернизация FolderBrowserDialog

В приложениях Windows Forms для .NET Core в элемент управления FolderBrowserDialog внесены изменения.

Описание изменения

В Windows Forms в .NET Framework для элемента управления FolderBrowserDialog используется следующее диалоговое окно:

The FolderBrowserDialogControl in the .NET Framework

В .NET Core 3.0 в Windows Forms используется более новый элемент управления на основе COM, появившийся в Windows Vista:

The FolderBrowserDialogControl in the .NET Core

Представленные версии

3.0

Диалоговое окно будет обновлено автоматически.

Если вы хотите оставить исходное диалоговое окно, перед отображением диалогового окна задайте для свойства FolderBrowserDialog.AutoUpgradeEnabled значение false, как показано в следующем фрагменте кода:

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

Категория

Windows Forms

Затронутые API


Из некоторых типов Windows Forms удален атрибут SerializableAttribute

Атрибут SerializableAttribute был удален из некоторых классов Windows Forms, для которых нет известных сценариев двоичной сериализации.

Описание изменения

Следующие типы помечаются в .NET Framework атрибутом SerializableAttribute, который удален в .NET Core:

Механизм сериализации всегда имел серьезные проблемы в плане обслуживания и безопасности. Поддержка SerializableAttribute для типов означает, что их необходимо проверять на наличие изменений сериализации в разных версиях, а также, возможно, на разных платформах. Это затрудняет развитие таких типов и делает их обслуживание затратнее. Для этих типов нет известных сценариев двоичной сериализации, благодаря чему удаление атрибута имеет минимальные последствия.

Дополнительные сведения см. в разделе Двоичная сериализация.

Представленные версии

3.0

Измените код, работа которого зависит от возможности сериализации этих типов.

Категория

Windows Forms

Затронутые API

  • нет

Параметр совместимости AllowUpdateChildControlIndexForTabControls не поддерживается

Параметр совместимости Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls поддерживается в Windows Forms в .NET Framework 4.6 и более поздних версиях, но не поддерживается в .NET Core,а также в .NET Core 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 и использовать вместо него прежнюю версию 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 в Visual Studio для приложений Windows Forms на Visual Basic ссылаются на недоступные свойства типа 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

Категория

Windows Forms на Visual Basic

Затронутые 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


См. также