问题 如何打包面向通用Windows平台的.NET库?


如何以通用NuGet发布的现代通用方式打包通用Windows平台库?假设我有一个用C#编写的AnyCPU程序集,它导出一些代码和XAML用户控件。

这是一系列问题和答案,记录了我对现代NuGet包创作主题的研究结果,特别关注NuGet 3引入的变化。您可能还对一些相关问题感兴趣:


8383
2018-01-05 12:36


起源



答案:


这个答案建立在 用于打包面向.NET Framework的库的原则。首先阅读链接的答案,以便更好地理解以下内容。

首先,您必须选中项目构建设置中的“生成库布局”复选框。如果没有这个,就不可能使用库导出的XAML用户控件。确保将此设置应用于所有构建配置和体系结构。

除了基本的3个资产(请参阅上面链接的答案)之外,您还需要从构建输出目录中打包以下附加资产:

  • MyUwpLibrary.pri
  • MyUwpLibrary子目录

需要这些额外资源才能使用程序集导出的XAML用户控件。总是包括这些资产,即使你还没有从你的图书馆中导出任何XAML - 你可能有一天会这样做,这将是一件很难记住的事情!

要发布UWP库,您需要创建具有以下结构的NuGet包:

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

如果您熟悉.NET Framework库发布,那么这应该看起来非常熟悉和直接。您可以将以下模板用于nuspec文件:

<?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>

就是这样,真的!在创建NuGet包之前,请记住使用Release配置构建解决方案。有关更多详细信息,请参阅上面链接的有关打包.NET Framework库的答案。

一个示例库和相关的打包文件 可在GitHub上找到。对应于此答案的解决方案是SimpleUwpLibrary。


12
2018-01-05 12:36



真诚地感谢你!我在创建自己的UWP库时遇到了麻烦,我认为这解决了我的问题。 - James Ko
另外:可以使用不同的TFM(而不是 uap10.0)是 netcore50。 - James Ko
只有在相应的构建配置中将GenerateLibraryLayout标志设置为true时,才会创建MyUwpLibrary子目录。 - halllo


答案:


这个答案建立在 用于打包面向.NET Framework的库的原则。首先阅读链接的答案,以便更好地理解以下内容。

首先,您必须选中项目构建设置中的“生成库布局”复选框。如果没有这个,就不可能使用库导出的XAML用户控件。确保将此设置应用于所有构建配置和体系结构。

除了基本的3个资产(请参阅上面链接的答案)之外,您还需要从构建输出目录中打包以下附加资产:

  • MyUwpLibrary.pri
  • MyUwpLibrary子目录

需要这些额外资源才能使用程序集导出的XAML用户控件。总是包括这些资产,即使你还没有从你的图书馆中导出任何XAML - 你可能有一天会这样做,这将是一件很难记住的事情!

要发布UWP库,您需要创建具有以下结构的NuGet包:

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

如果您熟悉.NET Framework库发布,那么这应该看起来非常熟悉和直接。您可以将以下模板用于nuspec文件:

<?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>

就是这样,真的!在创建NuGet包之前,请记住使用Release配置构建解决方案。有关更多详细信息,请参阅上面链接的有关打包.NET Framework库的答案。

一个示例库和相关的打包文件 可在GitHub上找到。对应于此答案的解决方案是SimpleUwpLibrary。


12
2018-01-05 12:36



真诚地感谢你!我在创建自己的UWP库时遇到了麻烦,我认为这解决了我的问题。 - James Ko
另外:可以使用不同的TFM(而不是 uap10.0)是 netcore50。 - James Ko
只有在相应的构建配置中将GenerateLibraryLayout标志设置为true时,才会创建MyUwpLibrary子目录。 - halllo