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


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

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

Заметка

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

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

.NET 8

Атрибут IDispatchImplAttribute API удален

.NET Core 2.1

Изменение значения по умолчанию UseShellExecute

ProcessStartInfo.UseShellExecute имеет значение по умолчанию false в .NET Core. В .NET Framework значение по умолчанию — true.

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

Process.Start позволяет запускать приложение напрямую, например с помощью кода, например Process.Start("mspaint.exe"), запускающего Paint. Он также позволяет запускать связанное приложение косвенно, если ProcessStartInfo.UseShellExecute имеет значение true. В .NET Framework значение по умолчанию для ProcessStartInfo.UseShellExecute равно true, что означает, что код, например, Process.Start("mytextfile.txt"), запустит Блокнот, если вы связали файлы .txt с этим редактором. Чтобы предотвратить косвенный запуск приложения в .NET Framework, необходимо явно задать ProcessStartInfo.UseShellExecute на false. В .NET Core значение по умолчанию для ProcessStartInfo.UseShellExecute равно false. Это означает, что по умолчанию связанные приложения не запускаются при вызове Process.Start.

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

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

N/A


Сети

.NET Core 2.0

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

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

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

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

Это изменение было реализовано, так как API WebClient не рекомендуется использовать в пользу HttpClient.

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

2.0

Используйте класс System.Net.Http.HttpClient вместо System.Net.WebClient, который не рекомендуется.

Категория

Сети

Затронутые API


Windows Forms

Поддержка Windows Forms была добавлена в .NET Core версии 3.0. Если вы переносите приложение Windows Forms из .NET Framework в .NET Core, критические изменения, перечисленные здесь, могут повлиять на ваше приложение.

.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, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Главное меню MenuStrip
Меню ToolStripDropDown, ToolStripDropDownMenu КоллекцияПунктовМеню
Элемент меню ToolStripMenuItem
Панель инструментов Панель инструментов (ToolStrip) Вид панели инструментов
КнопкаПанелиИнструментов 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 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);
}

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

  • Присвойв свойству MSBuild ApplicationDefaultFont значение "Microsoft Sans Serif, 8.25pt". Это предпочтительный способ, так как он позволяет Visual Studio использовать новые параметры в конструкторе.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • При вызове Application.SetDefaultFont(Font).

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

Категория

  • Windows Forms

Затронутые API

Нет.


Модернизация диалога выбора папки

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

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

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

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

Поддержка My Visual Basic была улучшена в .NET 5, обновите проект до .NET 5 или более поздней версии.

-или-

Исправьте ошибки компилятора в типах About и SplashScreen в вашем приложении. Используйте класс System.Reflection.Assembly для получения сведений, предоставленных типом My.Application.Info. Здесь доступен прямой порт обеих форм.

Совет

Это пример кода и неоптимизирован. Список атрибутов должен кэшироваться для уменьшения времени загрузки формы.

о

Imports System.Reflection

Public NotInheritable Class About

    Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the title of the form.
        Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(applicationTitle) Then
            applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        Me.Text = String.Format("About {0}", applicationTitle)
        ' Initialize all of the text displayed on the About Box.
        ' TODO: Customize the application's assembly information in the "Application" pane of the project
        '    properties dialog (under the "Project" menu).
        Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
        Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
        Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
        Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
        Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
    End Sub

    Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
        Me.Close()
    End Sub

End Class

Заставка

Imports System.Reflection

Public NotInheritable Class SplashScreen

    Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'Set up the dialog text at runtime according to the application's assembly information.  

        'TODO: Customize the application's assembly information in the "Application" pane of the project
        '  properties dialog (under the "Project" menu).

        'Application title
        Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title

        If String.IsNullOrEmpty(appTitle) Then
            appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
        End If

        ApplicationTitle.Text = appTitle

        Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version

        'Format the version information using the text set into the Version control at design time as the
        '  formatting string.  This allows for effective localization if desired.
        '  Build and revision information could be included by using the following code and changing the
        '  Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar.  See
        '  String.Format() in Help for more information.
        '
        '    Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)

        Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)

        'Copyright info
        Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
    End Sub

End Class

Категория

Visual Basic Windows Forms

Затронутые API

Никакой


Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices недоступны

Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices недоступны.

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

.NET Core 3.0

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

Типы в пространстве имен Microsoft.VisualBasic.ApplicationServices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.

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

Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.

-или-

Если код зависит от использования типов Microsoft.VisualBasic.ApplicationServices и их членов, вы можете использовать соответствующий тип или член в библиотеке классов .NET. Например, некоторые члены System.Environment и System.Security.Principal.WindowsIdentity предоставляют эквивалентные функциональные возможности свойств класса Microsoft.VisualBasic.ApplicationServices.User.

Категория

Visual Basic

Затронутые API


Типы в пространстве имен Microsoft.VisualBasic.Devices недоступны

Типы в пространстве имен Microsoft.VisualBasic.Devices недоступны.

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

.NET Core 3.0

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

Типы в пространстве имен Microsoft.VisualBasic.Devices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.

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

Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.

-или-

Если код зависит от использования типов Microsoft.VisualBasic.Devices и их членов, вы можете использовать соответствующий тип или член в библиотеке классов .NET. Например, эквивалентные функциональные возможности класса Microsoft.VisualBasic.Devices.Clock предоставляются типами System.DateTime и System.Environment, а эквивалентные функциональные возможности класса Microsoft.VisualBasic.Devices.Ports предоставляются типами в пространстве имен System.IO.Ports.

Категория

Visual Basic

Затронутые API


Типы в пространстве имен Microsoft.VisualBasic.MyServices недоступны

Типы в пространстве имен Microsoft.VisualBasic.MyServices недоступны.

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

.NET Core 3.0

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

Типы в пространстве имен Microsoft.VisualBasic.MyServices были доступны в .NET Framework. Они недоступны в .NET Core 3.0 — 3.1.

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

Это пространство имен было добавлено в .NET 5, обновите проект до .NET 5 или более поздней версии.

-или-

Если ваш код основывается на использовании типов Microsoft.VisualBasic.MyServices и их элементов, в библиотеке классов .NET есть соответствующие типы и элементы. Ниже приведено сопоставление типов Microsoft.VisualBasic.MyServices с эквивалентными типами библиотек классов .NET:

Тип Microsoft.VisualBasic.MyServices Тип библиотеки классов .NET
ClipboardProxy System.Windows.Clipboard для приложений WPF System.Windows.Forms.Clipboard для приложений Windows Forms
FileSystemProxy Типы в пространстве имен System.IO
RegistryProxy Типы, связанные с реестром в пространстве имен Microsoft.Win32
SpecialDirectoriesProxy Environment.GetFolderPath

Категория

Visual Basic

Затронутые API


См. также