Condividi tramite


Creare pacchetti UWP

Il Piattaforma UWP (Universal Windows Platform) fornisce una piattaforma di app comune per ogni dispositivo che esegue Windows 10. All'interno di questo modello, le app UWP possono chiamare entrambe le API WinRT comuni a tutti i dispositivi e anche le API (inclusi Win32 e .NET) specifiche della famiglia di dispositivi in cui è in esecuzione l'app.

In questa procedura dettagliata si crea un pacchetto NuGet con un componente UWP nativo (incluso un controllo XAML) che può essere usato in progetti gestiti e nativi.

Prerequisiti

  1. Visual Studio 2017 o Visual Studio 2015. Installare gratuitamente l'edizione Community 2017 da visualstudio.com; è possibile utilizzare anche le edizioni Professional ed Enterprise.

  2. CLI di NuGet Scaricare la versione più recente di nuget.exe da nuget.org/downloads, salvandolo in un percorso a scelta (il file scaricato è direttamente il .exe). Aggiungere quindi tale percorso alla variabile di ambiente PATH, se non lo è già.

Creare un componente Windows Runtime UWP

  1. In Visual Studio, scegliere File > Nuovo > Project, espandere il nodo Visual C++ > Windows > Universal, selezionare il componente Windows Runtime (Universal Windows) modello, modificare il nome in ImageEnhancer e fare clic su OK. Accettare i valori predefiniti per Versione di destinazione e Versione minima quando richiesto.

    Creazione di un nuovo progetto componente di runtime di Windows UWP

  2. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, selezionare Aggiungi > Nuovo elemento, fare clic sul nodo Visual C++ > XAML, selezionare Controllo con Modello, modificare il nome in AwesomeImageControl.cpp e fare clic su Aggiungi:

    Aggiunta di un nuovo elemento di controllo basato su modelli XAML al progetto

  3. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e selezionare Properties. Nella pagina Proprietà espandere Proprietà di configurazione > C/C++ e fare clic su Output Files. Nel riquadro a destra modificare il valore di Genera file di documentazione XML in Sì:

    Impostazione di Genera file di documentazione XML su Sì

  4. Fare clic con il pulsante destro del mouse sulla soluzione , selezionare Compilazione batch, selezionare le tre caselle Debug nella finestra di dialogo, come illustrato di seguito. In questo modo, quando si esegue una compilazione, si genera un set completo di artefatti per ogni sistema di destinazione supportato Windows.

    Compilazione batch

  5. Nella finestra di dialogo Compilazione batch fare clic su Compila per verificare il progetto e creare i file di output necessari per il pacchetto NuGet.

Annotazioni

In questa procedura dettagliata si usano gli artefatti di Debug per il pacchetto. Per il pacchetto non di debug, controllare invece le opzioni di Release nella finestra di dialogo Compilazione batch e fare riferimento alle cartelle Release risultanti nei passaggi successivi.

Creare e aggiornare il file .nuspec

Per creare il file iniziale .nuspec , eseguire i tre passaggi seguenti. Le sezioni che seguono illustrano gli altri aggiornamenti necessari.

  1. Aprire un prompt dei comandi e passare alla cartella contenente ImageEnhancer.vcxproj (si tratta di una sottocartella sotto la quale si trova il file della soluzione).

  2. Eseguire il comando NuGet spec per generare ImageEnhancer.nuspec (il nome del file viene ricavato dal nome del .vcxproj file):

    nuget spec
    
  3. Aprire ImageEnhancer.nuspec in un editor e aggiornarlo in modo che corrisponda al seguente, sostituendo YOUR_NAME con un valore appropriato. Il <id> valore, in particolare, deve essere univoco in nuget.org (vedere le convenzioni di denominazione descritte in Creazione di un pacchetto). Si noti anche che è necessario aggiornare anche i tag autore e descrizione oppure si riceve un errore durante il passaggio di compressione.

    <?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 2016</copyright>
        <tags>image enhancer imageenhancer</tags>
        </metadata>
    </package>
    

Annotazioni

Per i pacchetti creati per l'utilizzo pubblico, prestare particolare attenzione all'elemento <tags> , in quanto questi tag aiutano altri a trovare il pacchetto e a capire cosa fa.

Aggiunta di metadati Windows al pacchetto

Un componente Windows Runtime richiede metadati che descrivono tutti i tipi disponibili pubblicamente, che consente ad altre app e librerie di utilizzare il componente. Questi metadati sono contenuti in un file con estensione winmd, che viene creato durante la compilazione del progetto e devono essere inclusi nel pacchetto NuGet. Anche un file XML con dati IntelliSense viene compilato contemporaneamente e deve essere incluso anche.

Aggiungere il nodo seguente <files> al .nuspec file:

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

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

Aggiunta di contenuto XAML

Per includere un controllo XAML con il componente, devi aggiungere il file XAML con il modello predefinito per il controllo (come generato dal modello di progetto). Questo vale anche nella <files> sezione :

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

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

    </files>
</package>

Aggiunta delle librerie di implementazione nativa

All'interno del componente, la logica di base del tipo ImageEnhancer è nel codice nativo, contenuto nei vari ImageEnhancer.dll assembly generati per ogni runtime di destinazione (ARM, x86 e x64). Per includerli nel pacchetto, fare riferimento alla sezione <files> insieme ai file di risorse .pri associati:

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

        <!-- DLLs and resources -->
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
        <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>

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

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

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

    </files>
</package>

Aggiunta di .targets

Successivamente, i progetti C++ e JavaScript che potrebbero utilizzare il pacchetto NuGet necessitano di un file con estensione targets per identificare l'assembly e i file winmd necessari. I progetti C# e Visual Basic eseguono questa operazione automaticamente. Creare questo file copiando il testo seguente in ImageEnhancer.targets e salvarlo nella stessa cartella del file .nuspec. Nota: questo .targets file deve avere lo stesso nome dell'ID del pacchetto (ad esempio, l'elemento <Id> nel .nupspec file):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
        <ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
    </PropertyGroup>
    <ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
        <Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
            <Implementation>ImageEnhancer.dll</Implementation>
        </Reference>
    <ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
    </ItemGroup>
</Project>

Fare quindi riferimento a ImageEnhancer.targets nel .nuspec file:

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

        <!-- .targets -->
        <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

Versione finale .nuspec

Il file finale .nuspec dovrebbe ora essere simile al seguente, dove YOUR_NAME deve essere sostituito con un valore appropriato:

<?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 2016</copyright>
    <tags>image enhancer imageenhancer</tags>
    </metadata>
    <files>
    <!-- WinMd and IntelliSense -->
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>

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

    <!-- DLLs and resources -->
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
    <file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
    <file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>     
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
    <file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
    <file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>

    <!-- .targets -->
    <file src="ImageEnhancer.targets" target="build\native"/>

    </files>
</package>

Impacchettare il componente

Dopo aver completato .nuspec il riferimento a tutti i file che è necessario includere nel pacchetto, è possibile eseguire il pack comando:

nuget pack ImageEnhancer.nuspec

In questo modo viene generato ImageEnhancer.YOUR_NAME.1.0.0.nupkg. Aprendo questo file in uno strumento come Esplora pacchetti NuGet ed espandendo tutti i nodi, vengono visualizzati i contenuti seguenti:

Esplora pacchetti NuGet che mostra il pacchetto ImageEnhancer

Suggerimento

Un .nupkg file è solo un file ZIP con un'estensione diversa. È anche possibile esaminare il contenuto del pacchetto, quindi, passando .nupkg a .zip, ma ricordarsi di ripristinare l'estensione prima di caricare un pacchetto in nuget.org.

Per rendere disponibile il pacchetto ad altri sviluppatori, seguire le istruzioni riportate in Pubblicare un pacchetto.