Partilhar via


Alterações recentes para migração do .NET Framework para o .NET Core

Se você estiver migrando um aplicativo do .NET Framework para o .NET Core versões 1.0 a 3.1, as alterações recentes listadas neste artigo podem afetá-lo. As alterações significativas são agrupadas por categoria e, dentro dessas categorias, pela versão do .NET Core na qual foram introduzidas.

Observação

Este artigo não é uma lista completa de alterações significativas entre o .NET Framework e o .NET Core. As alterações principais mais importantes são adicionadas aqui à medida que delas temos conhecimento.

Principais bibliotecas .NET

.NET 8

API IDispatchImplAttribute é removida

.NET Core 2.1

Alteração no valor padrão de UseShellExecute

ProcessStartInfo.UseShellExecute tem um valor padrão de false no .NET Core. No .NET Framework, seu valor padrão é true.

Alterar descrição

Process.Start permite iniciar um aplicativo diretamente, por exemplo, com código como Process.Start("mspaint.exe") que inicia o Paint. Ele também permite que você inicie indiretamente um aplicativo associado se ProcessStartInfo.UseShellExecute estiver definido como true. No .NET Framework, o valor padrão para ProcessStartInfo.UseShellExecute é true, o que significa que um código como Process.Start("mytextfile.txt") iniciaria o Bloco de Notas, se você tiver associado .txt arquivos a esse editor. Para evitar iniciar indiretamente um aplicativo no .NET Framework, você deve definir explicitamente ProcessStartInfo.UseShellExecute como false. No .NET Core, o valor padrão para ProcessStartInfo.UseShellExecute é false. Isso significa que, por padrão, os aplicativos associados não são iniciados quando você chama Process.Start.

As seguintes propriedades no System.Diagnostics.ProcessStartInfo só são funcionais quando ProcessStartInfo.UseShellExecute é true:

Essa alteração foi introduzida no .NET Core por motivos de desempenho. Normalmente, Process.Start é usado para iniciar um aplicativo diretamente. Iniciar um aplicativo diretamente não precisa envolver o shell do Windows e incorrer no custo de desempenho associado. Para tornar esse caso padrão mais rápido, o .NET Core altera o valor padrão de ProcessStartInfo.UseShellExecute para false. Você pode optar pelo caminho mais lento, se precisar.

Versão introduzida

2.1

Observação

Em versões anteriores do .NET Core, UseShellExecute não foi implementado para Windows.

Se o seu aplicativo depender do comportamento antigo, chame Process.Start(ProcessStartInfo) com UseShellExecute definido como true no objeto ProcessStartInfo.

Categoria

Principais bibliotecas .NET

APIs afetadas


.NET Core 1.0

UnauthorizedAccessException lançado por FileSystemInfo.Attributes

No .NET Core, um UnauthorizedAccessException é lançado quando o chamador tenta definir um valor de atributo de arquivo, mas não tem permissão de gravação.

Alterar descrição

No .NET Framework, um ArgumentException é lançado quando o chamador tenta definir um valor de atributo de arquivo em FileSystemInfo.Attributes mas não tem permissão de gravação. No ambiente do .NET Core, um UnauthorizedAccessException é lançado. (No .NET Core, um ArgumentException ainda é lançado se o chamador tentar definir um atributo de arquivo inválido.)

Versão introduzida

1.0

Modifique quaisquer instruções catch para capturar um UnauthorizedAccessException em vez de um ArgumentException, ou além disso, conforme necessário.

Categoria

Principais bibliotecas .NET

APIs afetadas


A manipulação de exceções de estado corrompido não é suportada

Não há suporte para a manipulação de exceções de estado de processo corrompido no .NET Core.

Alterar descrição

Anteriormente, exceções de estado de processo corrompido podiam ser capturadas e tratadas por manipuladores de exceção de código gerenciado, por exemplo, usando uma instrução try-catch em C#.

A partir do .NET Core 1.0, exceções de estado de processo corrompido não podem ser tratadas por código gerenciado. O common language runtime não fornece exceções de estado de processo corrompido para o código gerenciado.

Versão introduzida

1.0

Evite lidar com exceções de estado de processo corrompido, resolvendo as situações que as causam. Se for absolutamente necessário lidar com exceções de estado de processo corrompido, escreva o manipulador de exceções em código C ou C++.

Categoria

Principais bibliotecas .NET

APIs afetadas


As propriedades do UriBuilder já não acrescentam caracteres iniciais

UriBuilder.Fragment não mais adiciona um caractere inicial de #, e UriBuilder.Query não mais adiciona um caractere inicial de ? quando um já está presente.

Alterar descrição

No .NET Framework, as propriedades UriBuilder.Fragment e UriBuilder.Query sempre precedem um caractere # ou ?, respectivamente, ao valor que está sendo armazenado. Esse comportamento pode resultar em vários # ou ? caracteres no valor armazenado se a cadeia de caracteres já contém um desses caracteres principais. Por exemplo, o valor de UriBuilder.Fragment pode se tornar ##main.

A partir do .NET Core 1.0, estas propriedades deixaram de antepor os caracteres # ou ? ao valor armazenado se estes já estiverem presentes no início da cadeia de caracteres.

Versão introduzida

1.0

Não é mais necessário remover explicitamente nenhum desses caracteres principais ao definir os valores de propriedade. Isso é especialmente útil quando se está adicionando valores, porque não precisa mais remover o # ou ? no início cada vez que adiciona.

Por exemplo, o trecho de código a seguir mostra a diferença de comportamento entre o .NET Framework e o .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);
  • No .NET Framework, a saída é ????one=1&two=2&three=3&four=4.
  • No .NET Core, a saída é ?one=1&two=2&three=3&four=4.

Categoria

Principais bibliotecas .NET

APIs afetadas


Process.StartInfo lança InvalidOperationException para processos que você não iniciou

Ler a propriedade Process.StartInfo de processos não iniciados pelo seu código lança um InvalidOperationException.

Alterar descrição

No .NET Framework, acessar a propriedade Process.StartInfo para processos que seu código não iniciou retorna um objeto ProcessStartInfo fictício. O objeto fictício contém valores padrão para todas as suas propriedades, exceto EnvironmentVariables.

A partir do .NET Core 1.0, se você ler a propriedade Process.StartInfo de um processo que não iniciou (ou seja, chamando Process.Start), uma InvalidOperationException será lançada.

Versão introduzida

1.0

Não acesse a propriedade Process.StartInfo para processos que seu código não iniciou. Por exemplo, não leia esta propriedade para processos retornados por Process.GetProcesses.

Categoria

Principais bibliotecas .NET

APIs afetadas


Criptografia

.NET Core 2.1

O parâmetro booleano de SignedCms.ComputeSignature é respeitado

No .NET Core, o parâmetro Boolean silent do método SignedCms.ComputeSignature(CmsSigner, Boolean) é respeitado. Um prompt de PIN não será exibido se esse parâmetro estiver definido como true.

Alterar descrição

No .NET Framework, o parâmetro silent do método SignedCms.ComputeSignature(CmsSigner, Boolean) é ignorado e um prompt de PIN é sempre mostrado se exigido pelo provedor. No .NET Core, o parâmetro silent é respeitado e, se definido como true, um prompt de PIN nunca é mostrado, mesmo que seja exigido pelo provedor.

O suporte para mensagens CMS/PKCS #7 foi introduzido no .NET Core na versão 2.1.

Versão introduzida

2.1

Para garantir que um prompt de PIN apareça, se necessário, os aplicativos da área de trabalho devem chamar SignedCms.ComputeSignature(CmsSigner, Boolean) e definir o parâmetro booleano para false. O comportamento resultante é o mesmo que no .NET Framework, independentemente de o contexto silencioso estar desabilitado lá.

Categoria

Criptografia

APIs afetadas


MSBuild

.NET Core 3.0

Alteração do nome do ficheiro de manifesto de recurso

A partir do .NET Core 3.0, no caso padrão, o MSBuild gera um nome de arquivo de manifesto diferente para arquivos de recurso.

Versão introduzida

3.0

Alterar descrição

Antes do .NET Core 3.0, se nenhum metadado LogicalName, ManifestResourceNameou DependentUpon fosse especificado para um item de EmbeddedResource no ficheiro de projeto, o MSBuild gerava um nome de ficheiro de manifesto no padrão <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources. Se RootNamespace não estiver definido no arquivo de projeto, o padrão será o nome do projeto. Por exemplo, o nome de manifesto gerado para um arquivo de recurso chamado Form1.resx no diretório raiz do projeto foi MyProject.Form1.resources.

A partir do .NET Core 3.0, se um arquivo de recurso for colocalizado com um arquivo de origem com o mesmo nome (por exemplo, Form1.resx e Form1.cs), o MSBuild usará informações de tipo do arquivo de origem para gerar o nome do arquivo de manifesto no padrão <Namespace>.<ClassName>.resources. O namespace e o nome da classe são extraídos do primeiro tipo no arquivo de origem localizado. Por exemplo, o nome de manifesto gerado para um ficheiro de recurso chamado Form1.resx que está localizado em conjunto com um ficheiro de origem chamado Form1.cs é MyNamespace.Form1.resources. A principal coisa a observar é que a primeira parte do nome do arquivo é diferente das versões anteriores do .NET Core (MyNamespace em vez de MyProject).

Observação

Se você tiver metadados LogicalName, ManifestResourceNameou DependentUpon especificados em um item EmbeddedResource no arquivo de projeto, essa alteração não afetará esse arquivo de recurso.

Essa alteração crítica foi introduzida com a adição da propriedade EmbeddedResourceUseDependentUponConvention aos projetos .NET Core. Por padrão, os arquivos de recursos não são listados explicitamente em um arquivo de projeto .NET Core, portanto, eles não têm metadados para especificar como nomear o arquivo de .resources gerado. Quando EmbeddedResourceUseDependentUponConvention é definido como true, que é o padrão, o MSBuild procura um ficheiro de origem localizado no mesmo local e extrai um namespace e um nome de classe desse ficheiro. Se você definir EmbeddedResourceUseDependentUponConvention como false, o MSBuild gerará o nome do manifesto de acordo com o comportamento anterior, que combina RootNamespace e o caminho do arquivo relativo.

Na maioria dos casos, nenhuma ação é necessária por parte do desenvolvedor, e seu aplicativo deve continuar a funcionar. No entanto, se essa alteração quebrar seu aplicativo, você poderá:

  • Altere seu código para esperar o novo nome de manifesto.

  • Desative a nova convenção de nomenclatura definindo EmbeddedResourceUseDependentUponConvention para false no arquivo de projeto.

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

Categoria

MSBuild

APIs afetadas

N/A


Ligação em rede

.NET Core 2.0

WebClient.CancelAsync nem sempre cancela imediatamente

A partir do .NET Core 2.0, chamar WebClient.CancelAsync() não cancela imediatamente o pedido se a resposta já tiver começado a ser carregada.

Alterar descrição

Anteriormente, ligar para WebClient.CancelAsync() cancelava a solicitação imediatamente. A partir do .NET Core 2.0, chamar WebClient.CancelAsync() cancela a solicitação imediatamente somente se a resposta não tiver começado a ser buscada. Se a resposta tiver começado a ser buscada, a solicitação será cancelada somente depois que uma resposta completa for lida.

Essa alteração foi implementada porque a API WebClient foi preterida em favor de HttpClient.

Versão introduzida

2.0

Use a classe System.Net.Http.HttpClient em vez de System.Net.WebClient, que foi preterido.

Categoria

Ligação em rede

APIs afetadas


Formulários do Windows

O suporte a Windows Forms foi adicionado ao .NET Core na versão 3.0. Se você estiver migrando um aplicativo do Windows Forms do .NET Framework para o .NET Core, as alterações recentes listadas aqui podem afetar seu aplicativo.

.NET Core 3.1

Controles removidos

A partir do .NET Core 3.1, alguns controles do Windows Forms não estão mais disponíveis.

Alterar descrição

A partir do .NET Core 3.1, vários controles do Windows Forms não estão mais disponíveis. Controles de substituição que têm melhor design e suporte foram introduzidos no .NET Framework 2.0. Os controles preteridos foram removidos anteriormente das caixas de ferramentas do designer, mas ainda estavam disponíveis para serem usados.

Os seguintes tipos não estão mais disponíveis:

Versão introduzida

3.1

Cada controlo removido tem um controlo de substituição recomendado. Consulte a tabela a seguir:

Controle removido (API) Substituição recomendada APIs associadas que são removidas
Menu de contexto ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Menu principal MenuStrip
Menu ToolStripDropDown, ToolStripDropDownMenu ColeçãoDeItensDeMenu
Item de Menu ToolStripMenuItem
Barra de ferramentas Barra de ferramentas Aparência da Barra de Ferramentas
Botão da Barra de Ferramentas Botão da Barra de Ferramentas ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Categoria

Formulários do Windows

APIs afetadas


O evento de formatação de células não é acionado se a dica de ferramenta for mostrada

Uma DataGridView agora mostra as dicas de texto e de erro de uma célula quando pressionada por um mouse e quando selecionada através do teclado. Se uma dica de ferramenta for mostrada, o evento DataGridView.CellFormatting não será gerado.

Alterar descrição

Antes do .NET Core 3.1, um DataGridView que tinha a propriedade ShowCellToolTips definida como true mostrava um tooltip do texto e dos erros de uma célula quando o rato passava sobre a célula. As dicas de ferramentas não eram mostradas quando uma célula era selecionada através do teclado (por exemplo, usando a tecla Tab, teclas de atalho ou navegação por seta). Se o usuário editou uma célula e, enquanto o DataGridView ainda estava no modo de edição, passou o mouse sobre uma célula que não tinha a propriedade ToolTipText definida, um evento CellFormatting foi gerado para formatar o texto da célula para exibição na célula.

Para atender aos padrões de acessibilidade, a partir do .NET Core 3.1, um DataGridView que tem a propriedade ShowCellToolTips definida como true mostra sugestões para o texto e erros de uma célula não apenas quando a célula está sobre, mas também quando é seleccionada usando o teclado. Como consequência dessa alteração, o evento CellFormattingnão é gerado quando as células que não têm a propriedade ToolTipText definida são sobrevoadas enquanto o DataGridView está no modo de edição. O evento não é gerado porque o conteúdo da célula realçada é apresentado como uma dica de ferramenta em vez de ser exibido na célula.

Versão introduzida

3.1

Refatore qualquer código que dependa do evento CellFormatting enquanto o DataGridView estiver no modo de edição.

Categoria

Formulários do Windows

APIs afetadas

Nenhum


.NET Core 3.0

Fonte de controle padrão alterada para Segoe UI 9 pt

Alterar descrição

No .NET Framework, a propriedade Control.DefaultFont foi definida como Microsoft Sans Serif 8.25 pt. A imagem a seguir mostra uma janela que usa a fonte padrão.

Fonte de controle padrão no .NET Framework

A partir do .NET Core 3.0, a fonte padrão é definida como Segoe UI 9 pt (a mesma fonte que SystemFonts.MessageBoxFont). Como resultado dessa alteração, os formulários e controles são dimensionados cerca de 27% maiores para levar em conta o tamanho maior da nova fonte padrão. Por exemplo:

Fonte de controle padrão no .NET Core

Essa alteração foi feita para se alinhar com diretrizes de experiência do usuário (UX) do Windows.

Versão introduzida

3.0

Devido à alteração no tamanho dos formulários e controles, certifique-se de que seu aplicativo seja renderizado corretamente.

Para manter a fonte original para um único formulário, defina sua fonte padrão como Microsoft Sans Serif 8.25 pt. Por exemplo:

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

Ou, você pode alterar a fonte padrão para um aplicativo inteiro de uma das seguintes maneiras:

  • Definindo a propriedade ApplicationDefaultFont MSBuild como "Microsoft Sans Serif, 8.25pt". Essa é a técnica preferida porque permite que o Visual Studio use as novas configurações no designer.

    <PropertyGroup>
      <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
    </PropertyGroup>
    
  • Ao chamar 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());
        }
    }
    

Categoria

  • Formulários do Windows

APIs afetadas

Nenhuma.


Modernização do FolderBrowserDialog

O controle FolderBrowserDialog foi alterado em aplicativos Windows Forms para .NET Core.

Alterar descrição

No .NET Framework, os Windows Forms usam a seguinte caixa de diálogo padrão para o controlo FolderBrowserDialog:

o FolderBrowserDialogControl no .NET Framework

No .NET Core 3.0, o Windows Forms usa um controle baseado em COM mais recente que foi introduzido no Windows Vista:

o FolderBrowserDialogControl no .NET Core

Versão introduzida

3.0

A caixa de diálogo será atualizada automaticamente.

Se desejar manter a caixa de diálogo original, defina a propriedade FolderBrowserDialog.AutoUpgradeEnabled como false antes de mostrar a caixa de diálogo, conforme ilustrado pelo seguinte fragmento de código:

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

Categoria

Formulários do Windows

APIs afetadas


O SerializableAttribute removido de alguns tipos de Windows Forms

O SerializableAttribute foi removido de algumas classes do Windows Forms que não têm cenários de serialização binária conhecidos.

Alterar descrição

Os seguintes tipos são decorados com o SerializableAttribute no .NET Framework, mas o atributo foi removido no .NET Core:

Historicamente, esse mecanismo de serialização tem tido sérias preocupações de manutenção e segurança. Manter SerializableAttribute em tipos significa que esses tipos devem ser testados para alterações de serialização de versão para versão e, potencialmente, alterações de serialização de framework para framework. Isso dificulta a evolução desses tipos e pode ser caro para manter. Esses tipos não têm cenários de serialização binária conhecidos, o que minimiza o impacto da remoção do atributo.

Para mais informações, consulte Serialização binária.

Versão introduzida

3.0

Atualize qualquer código que possa depender de esses tipos serem marcados como serializáveis.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

Opção de compatibilidade AllowUpdateChildControlIndexForTabControls não suportada

A opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls é suportada no Windows Forms no .NET Framework 4.6 e versões posteriores, mas não é suportada no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework 4.6 e versões posteriores, selecionar uma guia reordena sua coleção de controle. A opção de compatibilidade Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls permite que um aplicativo ignore essa reordenação quando esse comportamento é indesejável.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

A opção de compatibilidade DomainUpDown.UseLegacyScrolling não é suportada

A opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling, que foi introduzida no .NET Framework 4.7.1, não é suportada no Windows Forms no .NET Core ou no .NET 5.0 e versões posteriores.

Alterar descrição

A partir do .NET Framework 4.7.1, a opção de compatibilidade Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling permitiu que os desenvolvedores optassem por não usar ações independentes DomainUpDown.DownButton() e DomainUpDown.UpButton(). O switch restaurou o comportamento herdado, em que o DomainUpDown.UpButton() é ignorado se o texto de contexto estiver presente, e o programador é obrigado a usar a ação DomainUpDown.DownButton() no controlo antes da ação DomainUpDown.UpButton(). Para obter mais informações, consulte o elemento <AppContextSwitchOverrides>.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade DoNotLoadLatestRichEditControl não suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.7.1, não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework 4.6.2 e versões anteriores, o controle RichTextBox instancia o controle Win32 RichEdit v3.0 e, para aplicativos destinados ao .NET Framework 4.7.1, o controle RichTextBox instancia o RichEdit v4.1 (em msftedit.dll). A opção de compatibilidade Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl foi introduzida para permitir que os aplicativos destinados ao .NET Framework 4.7.1 e versões posteriores desativem o novo controle RichEdit v4.1 e usem o antigo controle RichEdit v3.

No .NET Core e .NET 5.0 e versões posteriores, a opção Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl não é suportada. Somente novas versões do controle RichTextBox são suportadas.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade DoNotSupportSelectAllShortcutInMultilineTextBox não suportada

A opção de compatibilidade Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox, que foi introduzida no .NET Framework 4.6.1, não é suportada no Windows Forms no .NET Core e .NET 5.0 e posterior.

Alterar descrição

A partir do .NET Framework 4.6.1, selecionar a tecla de atalho Ctrl + A num controlo TextBox selecionou todo o texto. No .NET Framework 4.6 e versões anteriores, selecionar a tecla de atalho Ctrl + A não conseguiu selecionar todo o texto se as propriedades Textbox.ShortcutsEnabled e TextBox.Multiline estivessem ambas definidas como true. A opção de compatibilidade Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox foi introduzida no .NET Framework 4.6.1 para manter o comportamento original. Para obter mais informações, consulte TextBox.ProcessCmdKey.

No .NET Core e .NET 5.0 e versões posteriores, a opção Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

Opção de compatibilidade DontSupportReentrantFilterMessage não suportada

A opção de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage, que foi introduzida no .NET Framework 4.6.1, não é suportada no Windows Forms no .NET Core e .NET 5.0 e posterior.

Alterar descrição

A partir do .NET Framework 4.6.1, a opção de compatibilidade Switch.System.Windows.Forms.DontSupportReentrantFilterMessage aborda possíveis exceções IndexOutOfRangeException quando a mensagem Application.FilterMessage é chamada com uma implementação personalizada de IMessageFilter.PreFilterMessage. Para obter mais informações, consulte Mitigação: Implementações Custom de IMessageFilter.PreFilterMessage.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.DontSupportReentrantFilterMessage não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


Opção de compatibilidade EnableVisualStyleValidation não suportada

A opção de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

No .NET Framework, a opção de compatibilidade Switch.System.Windows.Forms.EnableVisualStyleValidation permitiu que um aplicativo optasse por não validar estilos visuais fornecidos em um formulário numérico.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.EnableVisualStyleValidation não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

UseLegacyContextMenuStripSourceControlValue opção de compatibilidade não suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue, que foi introduzida no .NET Framework 4.7.2, não é suportada no Windows Forms no .NET Core ou .NET 5.0 e posterior.

Alterar descrição

A partir do .NET Framework 4.7.2, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue permite que o desenvolvedor desative o novo comportamento da propriedade ContextMenuStrip.SourceControl, que agora retorna uma referência ao controle do código-fonte. O comportamento anterior da propriedade era retornar null. Para obter mais informações, consulte <AppContextSwitchOverrides> elemento.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas


A opção de compatibilidade "UseLegacyImages" não é suportada

A opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages, que foi introduzida no .NET Framework 4.8, não é suportada no Windows Forms no .NET Core nem no .NET 5.0 e posteriores.

Alterar descrição

A partir do .NET Framework 4.8, a opção de compatibilidade Switch.System.Windows.Forms.UseLegacyImages resolveu possíveis problemas de dimensionamento de imagem em cenários ClickOnce em ambientes de alto DPI. Quando definido como true, o switch permite que o usuário restaure o dimensionamento de imagem herdado em monitores de DPI alto cuja escala é definida como superior a 100%. Para obter mais informações, consulte Notas de versão do .NET Framework 4.8 no GitHub.

No .NET Core e .NET 5.0 e posterior, a opção Switch.System.Windows.Forms.UseLegacyImages não é suportada.

Versão introduzida

3.0

Remova o interruptor. O switch não é suportado e nenhuma funcionalidade alternativa está disponível.

Categoria

Formulários do Windows

APIs afetadas

  • Nenhum

Sobre e os modelos SplashScreen estão quebrados

Os arquivos About.vb e SplashScreen.vb gerados pelo Visual Studio contêm referências a tipos no namespace My que não estão disponíveis .NET Core 3.0 e 3.1.

Versão introduzida

3.0

Alterar descrição

O .NET Core 3.0 e 3.1 não contêm suporte completo ao Visual Basic My. Os templates de formulário Sobre e SplashScreen no Visual Studio para Windows Forms em Visual Basic referenciam propriedades em um tipo My.Application.Info que não estão disponíveis.

O suporte ao Visual Basic My foi melhorado no .NET 5, atualize seu projeto para o .NET 5 ou posterior.

-ou-

Corrija os erros do compilador nos tipos Sobre e SplashScreen no seu aplicativo. Use a classe System.Reflection.Assembly para obter as informações fornecidas pelo tipo My.Application.Info. Uma porta direta de ambos os formulários está disponível aqui.

Dica

Este é um código de exemplo e não otimizado. A lista de atributos deve ser armazenada em cache para reduzir o tempo de carregamento do formulário.

Sobre

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

Categoria

Visual Basic Windows Forms

APIs afetadas

Nenhum


Tipos no namespace Microsoft.VisualBasic.ApplicationServices não estão disponíveis

Os tipos no namespace Microsoft.VisualBasic.ApplicationServices não estão disponíveis.

Versão introduzida

.NET Core 3.0

Alterar descrição

Os tipos no namespace Microsoft.VisualBasic.ApplicationServices estavam disponíveis no .NET Framework. Eles não estão disponíveis no .NET Core 3.0 - 3.1.

Os tipos foram removidos para evitar dependências de assembly desnecessárias ou alterações disruptivas em versões subsequentes.

Este namespace foi adicionado no .NET 5, atualize seu projeto para .NET 5 ou posterior.

-ou-

Se seu código depende do uso de tipos de Microsoft.VisualBasic.ApplicationServices e seus membros, você poderá usar um tipo ou membro correspondente na biblioteca de classes .NET. Por exemplo, alguns membros System.Environment e System.Security.Principal.WindowsIdentity fornecem funcionalidade equivalente às propriedades da classe Microsoft.VisualBasic.ApplicationServices.User.

Categoria

Visual Basic

APIs afetadas


Tipos no namespace Microsoft.VisualBasic.Devices não estão disponíveis

Os tipos no namespace Microsoft.VisualBasic.Devices não estão disponíveis.

Versão introduzida

.NET Core 3.0

Alterar descrição

Os tipos no namespace Microsoft.VisualBasic.Devices estavam disponíveis no .NET Framework. Eles não estão disponíveis no .NET Core 3.0 - 3.1.

Os tipos foram removidos para evitar dependências de compilação desnecessárias ou alterações incompatíveis em versões subsequentes.

Este namespace foi adicionado no .NET 5, atualize seu projeto para .NET 5 ou posterior.

-ou-

Se seu código depende do uso de tipos de Microsoft.VisualBasic.Devices e seus membros, você poderá usar um tipo ou membro correspondente na biblioteca de classes .NET. Por exemplo, a funcionalidade equivalente à classe Microsoft.VisualBasic.Devices.Clock é fornecida pelos tipos System.DateTime e System.Environment, e a funcionalidade equivalente à classe Microsoft.VisualBasic.Devices.Ports é fornecida pelos tipos no namespace System.IO.Ports.

Categoria

Visual Basic

APIs afetadas


Tipos no namespace Microsoft.VisualBasic.MyServices não estão disponíveis

Os tipos no namespace Microsoft.VisualBasic.MyServices não estão disponíveis.

Versão introduzida

.NET Core 3.0

Alterar descrição

Os tipos no namespace Microsoft.VisualBasic.MyServices estavam disponíveis no .NET Framework. Eles não estão disponíveis no .NET Core 3.0 - 3.1.

Os tipos foram removidos para evitar dependências desnecessárias de compilação ou incompatibilidades em versões subsequentes.

Este namespace foi adicionado no .NET 5, atualize seu projeto para .NET 5 ou posterior.

-ou-

Se seu código depender do uso de tipos de Microsoft.VisualBasic.MyServices e seus membros, há tipos e membros correspondentes na biblioteca de classes .NET. A seguir está um mapeamento de tipos de Microsoft.VisualBasic.MyServices para seus tipos equivalentes de biblioteca de classes .NET:

Tipo Microsoft.VisualBasic.MyServices Tipo de biblioteca de classes .NET
ClipboardProxy System.Windows.Clipboard para aplicativos WPF System.Windows.Forms.Clipboard para aplicativos Windows Forms
FileSystemProxy Tipos no namespace System.IO
RegistryProxy Tipos relacionados ao Registro no namespace Microsoft.Win32
SpecialDirectoriesProxy Environment.GetFolderPath

Categoria

Visual Basic

APIs afetadas


Ver também