Parte 1: Migrar o aplicativo Contoso Expenses para o .NET Core 3
Esta é a primeira parte de um tutorial que demonstra como modernizar um aplicativo da área de trabalho WPF de exemplo chamado Despesas da Contoso (ContosoExpenses). Para obter uma visão geral do tutorial, dos pré-requisitos e das instruções para baixar o aplicativo de exemplo, confira Tutorial: modernizar um aplicativo WPF.
Nesta parte do tutorial, você migrará todo o aplicativo de Despesas da Contoso do .NET Framework 4.7.2 para .NET Core 3. Antes de começar, certifique-se de abrir e criar o exemplo de ContosoExpenses no Visual Studio 2019.
Observação
Para obter mais informações sobre como migrar um aplicativo WPF do .NET Framework para o .NET Core 3, confira esta série de blogs.
Migrar o projeto ContosoExpenses para o .NET Core 3
Nesta seção, você migrará o projeto ContosoExpenses no aplicativo de despesas da Contoso para o .NET Core 3. Para isso, criará um arquivo de projeto que contenha os mesmos arquivos do projeto ContosoExpenses existente, mas que tenha como destino o .NET Core 3, em vez do .NET Framework 4.7.2. Isso permite que você mantenha uma única solução com as duas versões do aplicativo, .NET Framework e .NET Core.
Verifique se o projeto ContosoExpenses atualmente tem como destino o .NET Framework 4.7.2. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto ContosoExpenses, escolha Propriedades e confirme se a propriedade Estrutura de destino na guia Aplicativo está definida como o .NET Framework 4.7.2.
No Windows Explorer, abra a pasta C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses e crie um arquivo de texto chamado ContosoExpenses.Core.csproj.
Clique com o botão direito do mouse no arquivo, escolha Abrir com e abra-o em um editor de texto de sua escolha, como Bloco de Notas, Visual Studio Code ou Visual Studio.
Copie o texto a seguir, cole-o no arquivo e salve-o.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>
Feche o arquivo e retorne para a solução ContosoExpenses no Visual Studio.
Clique com o botão direito do mouse na solução ContosoExpenses e escolha Adicionar > Projeto Existente. Selecione o arquivo ContosoExpenses.Core.csproj que você acabou de criar na pasta
C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses
para adicioná-lo à solução.
O ContosoExpenses.Core.csproj inclui os seguintes elementos:
- O elemento Project especifica uma versão do SDK de Microsoft.NET.Sdk.WindowsDesktop. Isso se refere a aplicativos .NET da Área de Trabalho do Windows e inclui componentes para aplicativos WPF e Windows Forms.
- O elemento PropertyGroup contém elementos filho que indicam que a saída do projeto é um executável (não uma DLL), tem como destino o .NET Core 3 e usa WPF. Para um aplicativo Windows Forms, você usaria um elemento UseWinForms, em vez do elemento UseWPF.
Observação
Ao trabalhar com o formato .csproj, introduzido com o .NET Core 3.0, todos os arquivos na mesma pasta que o .csproj serão considerados parte do projeto. Portanto, você não precisa especificar todos os arquivos incluídos no projeto. Você precisa especificar somente os arquivos para os quais deseja definir uma ação de compilação personalizada ou que deseja excluir.
Migrar o projeto ContosoExpenses.Data para .NET Standard
A solução ContosoExpenses inclui uma biblioteca de classes do ContosoExpenses.Data que contém modelos e interfaces para serviços e destinos .NET 4.7.2. Os aplicativos .NET Core 3.0 podem usar bibliotecas do .NET Framework, desde que não usem APIs não disponíveis no .NET Core. No entanto, o melhor caminho de modernização é mover suas bibliotecas para .NET Standard. Isso garantirá que a biblioteca tenha suporte total do aplicativo .NET Core 3.0. Além disso, você pode reutilizar a biblioteca também com outras plataformas, como Web (por meio do ASP.NET Core) e móvel (por meio do Xamarin).
Para migrar o projeto ContosoExpenses.Data para o .NET Standard:
No Visual Studio, clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Data.csproj.
Exclua todo o conteúdo do arquivo do projeto.
Copie e cole o XML a seguir e salve o arquivo.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>
Clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Recarregar projeto.
Configurar os pacotes e dependências do NuGet
Quando você migrou os projetos ContosoExpenses.Core e ContosoExpenses.Data nas seções anteriores, removeu as referências do pacote NuGet dos projetos. Nesta seção, você voltará a adicionar essas referências.
Para configurar pacotes NuGet para o projeto ContosoExpenses.Data:
No projeto ContosoExpenses.Data, expanda o nó de Dependências. Observe que a seção NuGet está ausente.
Se você abrir Packages.config no Gerenciador de Soluções, encontrará as referências "antigas" dos pacotes NuGet que usaram o projeto quando ele estava utilizando o .NET Framework completo.
Confira abaixo o conteúdo do arquivo Packages.config. Você notará que todos os pacotes NuGet têm como destino o .NET Framework 4.7.2 completo:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Bogus" version="26.0.2" targetFramework="net472" /> <package id="LiteDB" version="4.1.4" targetFramework="net472" /> </packages>
No projeto ContosoExpenses.Data, exclua o arquivo Packages.config.
No projeto ContosoExpenses.Data, clique com o botão direito do mouse no nó Dependências e escolha Gerenciar Pacotes NuGet.
Na janela Gerenciador de Pacotes NuGet, clique em Procurar. Pesquise o pacote
Bogus
e instale a versão estável mais recente.Pesquise o pacote
LiteDB
e instale a versão estável mais recente.Você pode estar imaginando onde essa lista de pacotes NuGet está armazenada, já que o projeto não tem mais um arquivo packages.config. Os pacotes NuGet referenciados são armazenados diretamente no arquivo.csproj. Para verificar isso, exiba o conteúdo do arquivo do projeto ContosoExpenses.Data.csproj em um editor de texto. Você encontrará as seguintes linhas adicionadas ao final do arquivo:
<ItemGroup> <PackageReference Include="Bogus" Version="26.0.2" /> <PackageReference Include="LiteDB" Version="4.1.4" /> </ItemGroup>
Observação
Você também perceberá que está instalando os mesmos pacotes para esse projeto do .NET Core 3 que os usados pelos projetos do .NET Framework 4.7.2. Os pacotes NuGet dão suporte a vários destinos. Os autores da biblioteca podem incluir versões diferentes de uma biblioteca no mesmo pacote, compiladas para diferentes arquiteturas e plataformas. Esses pacotes dão suporte ao .NET Framework completo, bem como .NET Standard 2.0, que é compatível com projetos do .NET Core 3. Para obter mais informações sobre as diferenças do .NET Framework, .NET Core e .NET Standard, confira .NET Standard.
Para configurar pacotes NuGet para o projeto ContosoExpenses.Core:
No projeto ContosoExpenses.Core, abra o arquivo packages.config. Atualmente, ele contém as referências a seguir direcionadas ao .NET Framework 4.7.2.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" /> <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" /> <package id="Unity" version="5.10.2" targetFramework="net472" /> </packages>
Nas etapas a seguir, você encontrará as versões .NET Standard dos pacotes
MvvmLightLibs
eUnity
. As outras duas são dependências baixadas automaticamente pelo NuGet quando você instala essas duas bibliotecas.No projeto ContosoExpenses.Core, exclua o arquivo Packages.config.
Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Gerenciar Pacotes NuGet.
Na janela Gerenciador de Pacotes NuGet, clique em Procurar. Pesquise o pacote
Unity
e instale a versão estável mais recente.Pesquise o pacote
MvvmLightLibsStd10
e instale a versão estável mais recente. Esta é a versão do .NET Standard do pacoteMvvmLightLibs
. No caso desse pacote, o autor optou por criar um pacote da versão do .NET Standard da biblioteca em um pacote separado da versão do .NET Framework.No projeto ContosoExpenses.Core, clique com o botão direito do mouse no nó Dependências e escolha Adicionar Referência.
Na categoria Projetos > Solução, selecione ContosoExpenses.Data e clique em OK.
Desabilitar atributos de assembly gerados automaticamente
Neste ponto do processo de migração, se você tentar criar o projeto ContosoExpenses.Core, verá alguns erros.
Esse problema está acontecendo porque o novo formato .csproj, introduzido no .NET Core 3.0, armazena as informações do assembly no arquivo do projeto, e não no arquivo AssemblyInfo.cs. Para corrigir esses erros, desabilite esse comportamento e deixe o projeto continuar usando o arquivo AssemblyInfo.cs.
No Visual Studio, clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Core.csproj.
Adicione o elemento a seguir na seção PropertyGroup e salve o arquivo.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
Depois de adicionar esse elemento, a seção PropertyGroup deverá ser exibida assim:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>
Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Recarregar Projeto.
Clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Data.csproj.
Adicione a mesma entrada na seção PropertyGroup e salve o arquivo.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
Depois de adicionar esse elemento, a seção PropertyGroup deverá ser exibida assim:
<PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>
Clique com o botão direito do mouse no projeto ContosoExpenses.Data e escolha Recarregar Projeto.
Adicionar o pacote de compatibilidade do Windows
Se você tentar compilar agora os projetos ContosoExpenses.Core e ContosoExpenses.Data, verá que os erros anteriores estão corrigidos, mas ainda são exibidos alguns erros na biblioteca de ContosoExpenses.Data semelhante aos outros.
Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context
Esses erros resultam da conversão do projeto ContosoExpenses.Data de uma biblioteca .NET Framework (específica para Windows) para uma biblioteca .NET Standard, que pode ser executada em várias plataformas, incluindo Linux, Android, iOS, entre outras. O projeto ContosoExpenses.Data contém uma classe chamada RegistryService, que interage com o registro, um conceito somente para Windows.
Para resolver esses erros, instale o pacote NuGet de Compatibilidade do Windows. Esse pacote dá suporte a muitas APIs específicas do Windows que devem ser usadas em uma biblioteca .NET Standard. Após a adoção desse pacote, a biblioteca deixará de ter uma plataforma cruzada, mas ainda terá como destino o .NET Standard.
Clique com o botão direito do mouse no projeto ContosoExpenses.Data.
Escolha Gerenciar Pacotes NuGet.
Na janela Gerenciador de Pacotes NuGet, clique em Procurar. Pesquise o pacote
Microsoft.Windows.Compatibility
e instale a versão estável mais recente.Agora, tente novamente compilar o projeto, clicando com o botão direito do mouse no projeto ContosoExpenses.Data e escolhendo Build.
Desta vez, o processo de build será concluído sem erros.
Testar e depurar a migração
Agora que os projetos estão sendo compilados com sucesso, você está pronto para executar e testar o aplicativo para ver se há algum erro de runtime.
Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Definir como Projeto de Inicialização.
Pressione F5 para inicializar o projeto ContosoExpenses.Core no depurador. Você verá uma exceção semelhante à seguinte.
Essa exceção está sendo gerada porque, quando você excluiu o conteúdo do arquivo.csproj no início da migração, removeu as informações sobre a Ação de Build dos arquivos de imagem. Siga as etapas abaixo para corrigir esse problema.
Pare o depurador.
Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Descarregar Projeto. Clique com o botão direito do mouse no projeto novamente e escolha Editar ContosoExpenses.Core.csproj.
Antes de fechar o elemento Project, adicione a seguinte entrada:
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Recarregar Projeto.
Para atribuir o Contoso.ico ao aplicativo, clique com o botão direito do mouse no projeto ContosoExpenses.Core e escolha Propriedades. Na página aberta, clique no menu suspenso em Ícone e selecione
Images\contoso.ico
.Clique em Salvar.
Pressione F5 para inicializar o projeto ContosoExpenses.Core no depurador. Confirme se o aplicativo agora é executado.
Próximas etapas
Neste ponto do tutorial, você migrou com sucesso o aplicativo de Despesas da Contoso para o .NET Core 3. Agora, você está pronto para a Parte 2: Adicionar um controle InkCanvas da UWP usando Ilhas XAML.
Observação
Se você tiver uma tela de alta resolução, poderá notar que o aplicativo parece muito pequeno. Você abordará esse problema na próxima etapa do tutorial.
Windows developer