Usar o Pacote de Compatibilidade do Windows para fazer a portabilidade para o .NET

Alguns dos problemas mais comuns durante a portabilidade do código do .NET Framework existente para o .NET são as dependências de APIs e de tecnologias encontradas apenas no .NET Framework. O Pacote de Compatibilidade do Windows fornece muitas dessas tecnologias, portanto, é muito mais fácil compilar aplicativos .NET e bibliotecas do .NET Standard.

O pacote de compatibilidade é uma extensão lógica do .NET Standard 2.0 que aumenta significativamente o conjunto de API. O código existente é compilado com quase nenhuma modificação. Para manter a promessa de "o conjunto de APIs que todas as implementações do .NET fornecem", o .NET Standard não inclui tecnologias que não funcionam em todas as plataformas, como Registro, WMI (Instrumentação de Gerenciamento do Windows) ou APIs de emissão de reflexão. O Pacote de Compatibilidade do Windows se baseia no .NET Standard e permite acesso a essas tecnologias somente do Windows. Ele é útil principalmente para clientes que querem migrar para o .NET, mas pretendem continuar no Windows como uma primeira etapa. Nesse cenário, você pode usar tecnologias somente do Windows para remover o obstáculo de migração.

Conteúdo do pacote

O Pacote de Compatibilidade do Windows é fornecido por meio do Pacote NuGet Microsoft.Windows.Compatibility e pode ser referenciado em projetos direcionados ao .NET ou ao .NET Standard.

Ele fornece cerca de 20 mil APIs, incluindo APIs somente do Windows, bem como APIs multiplataforma das seguintes áreas de tecnologia:

  • Páginas de código
  • CodeDom
  • Configuração
  • Serviços de Diretório
  • Desenho
  • ODBCODBC
  • Permissões
  • Portas
  • ACL (Listas de Controle de Acesso) do Windows
  • Windows Communication Foundation (WCF)
  • Criptografia do Windows
  • EventLog do Windows
  • WMI (Instrumentação de Gerenciamento do Windows)
  • Contadores de desempenho do Windows
  • Registro do Windows
  • Cache do Windows Runtime
  • Serviços Windows

Para obter mais informações, confira a especificação do pacote de compatibilidade.

Introdução

  1. Antes da portabilidade, examine o Processo de portabilidade.

  2. Ao portar um código existente para o .NET ou .NET Standard, instale o pacote NuGet Microsoft.Windows.Compatibility.

    Caso deseje permanecer no Windows, você estará pronto.

  3. Se desejar executar o aplicativo .NET ou a biblioteca .NET Standard no Linux ou no macOS, use o Analisador de compatibilidade de plataforma para localizar o uso de APIs que não funcionarão como multiplataforma.

  4. Remova os usos dessas APIs, substitua-os por alternativas de multiplataforma ou proteja-os usando uma verificação de plataforma, como:

    private static string GetLoggingPath()
    {
        // Verify the code is running on Windows.
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Fabrikam\AssetManagement"))
            {
                if (key?.GetValue("LoggingDirectoryPath") is string configuredPath)
                    return configuredPath;
            }
        }
    
        // This is either not running on Windows or no logging path was configured,
        // so just use the path for non-roaming user-specific data files.
        var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        return Path.Combine(appDataPath, "Fabrikam", "AssetManagement", "Logging");
    }
    

Para ver uma demonstração, confira o vídeo do Channel 9 sobre o Pacote de Compatibilidade do Windows.