How to package a .NET library targeting the Universal Windows Platform?
Asked Answered
T

1

12

How do I package a Universal Windows Platform library in a modern general-purpose way for publishing via NuGet? Let's assume I have a single AnyCPU assembly written in C# that exports some code and XAML user controls.

This is a series of questions and answers that document my findings on the topic of modern NuGet package authoring, focusing especially on the changes introduced with NuGet 3. You may also be interested in some related questions:

Toponymy answered 5/1, 2016 at 12:36 Comment(0)
T
12

This answer builds upon the principles used to package libraries targeting the .NET Framework. Read the linked answer first to better understand the following.

First you must check the "Generate library layout" checkbox in the project build settings. Without this, it will not be possible to use the XAML user controls exported by your library. Make sure to apply this setting for all build configurations and architectures.

In addition to the basic 3 assets (see answer linked above), you will also need to package the following additional assets from your build output directory:

  • MyUwpLibrary.pri
  • MyUwpLibrary subdirectory

These extra resources are required to make use of XAML user controls exported by your assembly. Always include these assets, even if you do not yet export any XAML from your library - you might do it one day and this will be tricky to remember later on!

To publish the UWP library, you need to create a NuGet package with the following structure:

\---lib
    \---uap10.0
        |   MyUwpLibrary.dll
        |   MyUwpLibrary.pdb
        |   MyUwpLibrary.pri
        |   MyUwpLibrary.xml
        |
        \---MyUwpLibrary
                HelloWorld.xaml
                MyUwpLibrary.xr.xml

If you are familiar with .NET Framework library publishing, this should look quite familiar and straightforward. You can use the following template for your nuspec file:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata minClientVersion="3.2">
        <id>Example.MyUwpLibrary</id>
        <version>1.0.0</version>
        <authors>Firstname Lastname</authors>
        <description>Example of a UWP library that exports a user control.</description>
        <dependencies>
            <dependency id="Newtonsoft.Json" version="8.0.1" />
        </dependencies>
    </metadata>
    <files>
        <!-- The double wildcard will also grab all the resource files and the resource subdirectory. -->
        <file src="..\bin\Release\MyUwpLibrary**" target="lib\uap10.0" />
    </files>
</package>

That's it, really! Remember to build your solution using the Release configuration before creating the NuGet package. For more details, refer to the answer about packaging a .NET Framework library, linked above.

A sample library and the relevant packaging files are available on GitHub. The solution corresponding to this answer is SimpleUwpLibrary.

Toponymy answered 5/1, 2016 at 12:36 Comment(3)
Thank you sincerely for this! I was running into trouble creating my own UWP library and I think this has solved the issues for me.Confirmand
Also: a different TFM that could be used (instead of uap10.0) is netcore50.Confirmand
The MyUwpLibrary subdirectory is only created if the GenerateLibraryLayout flag is set to true for the corresponding build configuration.Hyalite

© 2022 - 2024 — McMap. All rights reserved.