Поделиться через


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

Следующие свойства на System.Diagnostics.ProcessStartInfo работают только при ProcessStartInfo.UseShellExecutetrue.

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

Не применимо


Сети

.NET Core 2.0;

WebClient.CancelAsync не всегда отменяет немедленно

Начиная с .NET Core 2.0, вызов WebClient.CancelAsync() не отменяет запрос немедленно, если начато получение ответа.

Изменение описания

Ранее при вызове WebClient.CancelAsync() запрос немедленно отменялся. Начиная с .NET Core 2.0, вызов WebClient.CancelAsync() немедленно отменяет запрос, только если процесс получения ответа еще не начался. Если загрузка ответа началась, запрос отменяется только после полной его обработки.

Это изменение было реализовано, поскольку использование WebClient API устарело в пользу 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, которые удалены
контекстное меню Контекстное меню (ContextMenuStrip)
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestTypeType
Главное меню MenuStrip
Меню ToolStripDropDown, ToolStripDropDownMenu КоллекцияПунктовМеню
Элемент меню Элемент меню панели инструментов
Панель инструментов Панель инструментов (ToolStrip) Вид панели инструментов
КнопкаПанелиИнструментов кнопка на панели инструментов 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 pt

Изменение описания

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

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

Начиная с .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);
}

Кроме того, можно изменить шрифт по умолчанию для всего приложения следующим образом:

  • Присвоив свойству ApplicationDefaultFont MSBuild значение "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.

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, для которых не существует известных сценариев двоичной сериализации.

Изменение описания

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

Исторически этот механизм сериализации имел серьезные проблемы с обслуживанием и безопасностью. Поддержание 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 не содержат полную поддержку Visual Basic My . Шаблоны форм About и SplashScreen в приложениях Windows Forms на Visual Basic в Visual Studio ссылаются на свойства в типе My.Application.Info, которые недоступны.

Поддержка Visual Basic My была улучшена в .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.EnvironmentSystem.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


См. также