Compartilhar via


Criar pacotes UWP (C#)

A UWP (Plataforma Universal do Windows) fornece uma plataforma de aplicativo comum para todos os dispositivos que são executados no Windows 10. Nesse modelo, os aplicativos UWP podem chamar APIs do WinRT que são comuns a todos os dispositivos e APIs (incluindo Win32 e .NET) que são específicas para a família do dispositivo no qual o aplicativo está em execução.

Neste passo a passo, você cria um pacote NuGet com um componente UWP C# (incluindo um controle XAML) que pode ser usado em projetos nativos e gerenciados.

Pré-requisitos

  1. Visual Studio 2019. Instale a edição da Community 2019 gratuitamente em visualstudio.com. Você também pode usar as edições Professional e Enterprise.

  2. CLI do NuGet. Faça download da versão mais recente de nuget.exe em nuget.org/downloads e salve-a em um local de sua escolha. (O download é o arquivo .exe diretamente.) Adicione o local do arquivo de ferramenta à sua variável de ambiente PATH, se não estiver adicionado. Para obter mais informações, confira Instalando o nuget.exe.

Criar um componente do Windows Runtime da UWP

  1. No Visual Studio, selecione Arquivo > Novo > Projeto e procure “uwp c#”. Selecione o modelo componente do Windows Runtime (Universal Windows) e selecione Avançar. Altere o nome para ImageEnhancer e selecione Criar. Aceite os valores padrão para a Versão de Destino e a Versão Mínima quando solicitado.

    Creating a new UWP Windows Runtime Component project

  2. Clique com botão direito do mouse no projeto em Gerenciador de Soluções, selecione Adicionar > Novo Item, selecione Controle Modelo, altere o nome para AwesomeImageControl.cpp, e selecione Adicionar:

    Adding a new XAML Templated Control item to the project

  3. Clique com o botão direito do mouse no projeto em Gerenciador de Soluções e selecione Propriedades. Na página Propriedades, escolha a guia Build e habilite o Arquivo de Documentação XML:

    Setting Generate XML Documentation Files to Yes

  4. Clique com o botão direito do mouse na solução e selecione Build do Lote. Selecione as cinco caixas de build, conforme mostrado na imagem a seguir. Isso garante que, quando você fizer uma compilação, gerará um conjunto completo de artefatos para cada um dos sistemas de destino com os quais o Windows é compatível.

    Batch Build

  5. Na caixa de diálogo Build do Lote, selecione Build para verificar o projeto e criar os arquivos de saída de que você precisa para o pacote do NuGet.

Observação

Neste passo a passo, você usará os artefatos de Depuração para o pacote. Para o pacote sem depuração, marque as opções de Versão na caixa de diálogo de Build em Lotes e consulte as pastas de Versão resultantes nas etapas a seguir.

Criar e atualizar o arquivo .nuspec

Para criar o arquivo .nuspec inicial, conclua as etapas a seguir. As seções a seguir guiarão você pelas outras atualizações necessárias.

  1. Abra um prompt de comando e navegue até a pasta que contém o arquivo ImageEnhancer.csproj, que deve ser uma subpasta da pasta que contém o arquivo de solução.

  2. Execute o comando NuGet spec para gerar o arquivo ImageEnhancer.nuspec. O nome do arquivo é retirado do nome do arquivo .csroj.

    nuget spec
    
  3. Abra o ImageEnhancer.nuspec em um editor e atualize-o para corresponder ao seguinte, substituindo YOUR_NAME por um valor apropriado. Não deixe nenhum dos valores de $propertyName$. O valor <id>, especificamente, precisa ser exclusivo no nuget.org (consulte as convenções de nomenclatura descritas em Criando um pacote). Observe que você também precisa atualizar as marcas de autor e descrição ou um erro é mostrado durante a etapa de empacotamento.

    <?xml version="1.0"?>
    <package >
        <metadata>
        <id>ImageEnhancer.YOUR_NAME</id>
        <version>1.0.0</version>
        <title>ImageEnhancer</title>
        <authors>YOUR_NAME</authors>
        <owners>YOUR_NAME</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Awesome Image Enhancer</description>
        <releaseNotes>First release</releaseNotes>
        <copyright>Copyright 2020</copyright>
        <tags>image enhancer imageenhancer</tags>
        </metadata>
    </package>
    

Observação

Para pacotes compilados para consumo público, preste atenção especial ao elemento <tags>, visto que essas marcas ajudam outras pessoas a localizar o pacote e entender o que ele faz.

Adicionar metadados do Windows ao pacote

Um componente do Windows Runtime requer metadados que descrevem todos os seus tipos disponíveis publicamente, o que possibilita outros aplicativos e bibliotecas a consumirem o componente. Esses metadados estão contidos em um arquivo .winmd, que é criado quando você compila o projeto e precisa ser incluído em seu pacote do NuGet. Um arquivo XML com os dados do IntelliSense também é criado ao mesmo tempo e também deve ser incluído.

Adicione o nó <files> a seguir ao arquivo .nuspec:

<package>
    <metadata>
        ...
    </metadata>

    <files>
        <!-- WinMd and IntelliSense files -->
      <file src="bin\Debug\ImageEnhancer.winmd" target="lib\uap10.0"/>
      <file src="bin\Debug\ImageEnhancer.xml" target="lib\uap10.0"/>
    </files>
</package>

Adicionar conteúdo XAML

Para incluir um controle XAML no seu componente, você precisa adicionar o arquivo XAML que tem o modelo padrão para o controle (conforme gerado pelo modelo de projeto). Isso também vai para a seção <files>:

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- XAML controls -->
        <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    </files>
</package>

Adicionar as bibliotecas de implementação nativa

No seu componente, a lógica principal do tipo ImageEnhancer está no código nativo, que está contido nos vários assemblies ImageEnhancer.winmd que são gerados para cada runtime de destino (ARM, ARM64, x86 e x64). Para incluí-los no pacote, faça referência a eles na seção <files> juntamente com seus arquivos de recurso .pri associado:

<?xml version="1.0"?>
<package >
    <metadata>
        ...
    </metadata>
    <files>
        ...

        <!-- WINMDs and resources -->
      <file src="bin\ARM\Debug\ImageEnhancer.winmd" target="runtimes\win10-arm"/>
      <file src="bin\ARM\Debug\ImageEnhancer.pri" target="runtimes\win10-arm"/>

      <file src="bin\ARM64\Debug\ImageEnhancer.winmd" target="runtimes\win10-arm64"/>
      <file src="bin\ARM64\Debug\ImageEnhancer.pri" target="runtimes\win10-arm64"/>

      <file src="bin\x64\Debug\ImageEnhancer.winmd" target="runtimes\win10-x64"/>
      <file src="bin\x64\Debug\ImageEnhancer.pri" target="runtimes\win10-x64"/>

      <file src="bin\x86\Debug\ImageEnhancer.winmd" target="runtimes\win10-x86"/>
      <file src="bin\x86\Debug\ImageEnhancer.pri" target="runtimes\win10-x86"/>

    </files>
</package>

.nuspec final

O arquivo .nuspec final agora deve ser semelhante ao seguinte, em que novamente YOUR_NAME deve ser substituído por um valor apropriado:

<?xml version="1.0"?>
<package >
    <metadata>
    <id>ImageEnhancer.YOUR_NAME</id>
    <version>1.0.0</version>
    <title>ImageEnhancer</title>
    <authors>YOUR_NAME</authors>
    <owners>YOUR_NAME</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Awesome Image Enhancer</description>
    <releaseNotes>First Release</releaseNotes>
    <copyright>Copyright 2020</copyright>
    <tags>image enhancer imageenhancer</tags>
    </metadata>
    <files>
    <!-- WinMd and IntelliSense -->
      <file src="bin\Debug\ImageEnhancer.winmd" target="lib\uap10.0"/>
      <file src="bin\Debug\ImageEnhancer.xml" target="lib\uap10.0"/>

    <!-- XAML controls -->
    <file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>

    <!-- WINMDs and resources -->
      <file src="bin\ARM\Debug\ImageEnhancer.winmd" target="runtimes\win10-arm"/>
      <file src="bin\ARM\Debug\ImageEnhancer.pri" target="runtimes\win10-arm"/>

      <file src="bin\ARM64\Debug\ImageEnhancer.winmd" target="runtimes\win10-arm64"/>
      <file src="bin\ARM64\Debug\ImageEnhancer.pri" target="runtimes\win10-arm64"/>

      <file src="bin\x64\Debug\ImageEnhancer.winmd" target="runtimes\win10-x64"/>
      <file src="bin\x64\Debug\ImageEnhancer.pri" target="runtimes\win10-x64"/>

      <file src="bin\x86\Debug\ImageEnhancer.winmd" target="runtimes\win10-x86"/>
      <file src="bin\x86\Debug\ImageEnhancer.pri" target="runtimes\win10-x86"/>

    </files>
</package>

Empacotar o componente

Depois do .nuspec terminar de referenciar todos os arquivos que você precisa incluir no pacote, você estará pronto para executar o comando nuget pack:

nuget pack ImageEnhancer.nuspec

Isso gera ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Ao abrir este arquivo em uma ferramenta como o Explorador de Pacotes NuGet e expandir todos os nós, você verá o seguinte conteúdo:

NuGet Package Explorer showing the ImageEnhancer package

Dica

O arquivo .nupkg é apenas um arquivo ZIP com uma extensão diferente. Também é possível examinar o conteúdo do pacote alterando .nupkg para .zip, mas lembre-se de restaurar a extensão antes de carregar um pacote para o nuget.org.

Para disponibilizar o pacote para outros desenvolvedores, siga as instruções em Publicar um pacote.