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

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

Примечание

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

Библиотеки Core .NET

.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.

Категория

Библиотеки Core .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 по мере необходимости.

Категория

Библиотеки Core .NET

Затронутые API


Обработка исключений поврежденного состояния не поддерживается

Обработка исключений поврежденного состояния в .NET Core не поддерживается.

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

Ранее исключения поврежденного состояния процесса могли быть перехвачены и обработаны обработчиками исключений управляемого кода, например с помощью инструкции try-catch в C#.

Начиная с .NET Core 1.0 исключения поврежденного состояния процесса не могут обрабатываться управляемым кодом. Среда CLR не доставляет исключения поврежденного состояния процесса в управляемый код.

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

1.0

Старайтесь исключить потребность в обработке исключений поврежденного состояния процесса, устраняя ситуации, которые вызывают подобные исключения. Если обработка исключений поврежденного состояния процесса совершенно необходима, напишите обработчик исключений в коде C или C++.

Категория

Библиотеки Core .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.

Категория

Библиотеки Core .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.

Категория

Библиотеки Core .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

None


.NET Core 3.0

Шрифт элемента управления по умолчанию изменен на Segoe UI 9 пт

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

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

Шрифт по умолчанию для элемента управления в .NET Framework

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

Шрифт по умолчанию для элемента управления в .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 используется следующее диалоговое окно:

FolderBrowserDialogControl в .NET Framework

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

FolderBrowserDialogControl в .NET Core

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

3,0

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

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

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

Категория

Windows Forms

Затронутые API


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

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

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

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

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

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

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

3,0

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

Категория

Windows Forms

Затронутые API

  • None

Параметр совместимости 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

  • None

Параметр совместимости 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

  • None

Параметр совместимости 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

  • None

Параметр совместимости 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

  • None

Шаблоны 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

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

Категория

Windows Forms на Visual Basic

Затронутые API

None


Типы из пространства имен 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. Ниже приведено сопоставление Майкрософт. Типы 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


См. также раздел