.net 库中的内容未部署到UWP应用程序

.net 库中的内容未部署到UWP应用程序,.net,visual-studio,uwp,.net,Visual Studio,Uwp,我不确定这是错误还是正确的行为。复制: (在Visual Studio中)创建UWP项目 创建netstandard项目 将内容文件添加到netstandard项目(将其标记为“内容”,并将其设置为“更新时复制”) 从UWP项目添加对netstandard项目的引用 在调试模式下运行(无.NET本机工具链) 结果:内容文件将在生成时复制到bin/Debug文件夹,但不会复制/部署到bin/Debug/AppX文件夹 为什么内容文件在构建时会被复制,但最终不会被部署 如何正确地将内容添加到引用

我不确定这是错误还是正确的行为。复制:

  • (在Visual Studio中)创建UWP项目
  • 创建netstandard项目
  • 将内容文件添加到netstandard项目(将其标记为“内容”,并将其设置为“更新时复制”)
  • 从UWP项目添加对netstandard项目的引用
  • 在调试模式下运行(无.NET本机工具链)
结果:内容文件将在生成时复制到bin/Debug文件夹,但不会复制/部署到bin/Debug/AppX文件夹

  • 为什么内容文件在构建时会被复制,但最终不会被部署
  • 如何正确地将内容添加到引用的项目中,以便将其部署到UWP应用程序
  • 如果这是一个bug,报告它的最佳位置是哪里

  • 我在Windows 10 Fall Creators Update上使用Visual Studio 2017 v15.4.1。在类库中,文件在生成时被复制是因为“复制到输出”设置为“更新时复制”,而不是因为其生成操作是内容

    将一个新的.resx文件添加到类库中,然后使用设计器添加此文件(我假设它是一个图像)

    然后像这样从UWP应用程序中使用它(NewFolder是.resx文件的包含文件夹)

    注意:我在这篇博文中查看了.NET标准2.0的API列表,
    ResourceManager
    具有
    GetObject
    方法,该方法用于检索图像等二进制数据。在1.3版中,
    ResourceManager
    只有
    GetString
    方法,用于检索字符串文本。因此,您需要使类库的目标为.NET标准2.0

    结果:内容文件将在生成时复制到bin/Debug文件夹,但不会复制/部署到bin/Debug/AppX文件夹

    为什么内容文件在构建时会被复制,但最终不会被部署

    您已将内容添加到
    netstandard
    项目中(
    Copy if newer
    )。所以它将被复制到调试文件夹。此行为适用于
    PCL
    。如果需要验证,可以将内容文件添加到
    Xamarin
    share项目中,并检查内容文件的最后路径。这将与上述结果相同。 有关更多信息,请参阅

    2.我如何正确地将内容添加到引用的项目中,以便将其部署到UWP应用程序

    由于.NET标准库类似于PCL,因此您可以参考的一些文档。例如,与

    我已经证实了这一点。它也适用于.NET标准库

    示例 将图像文件添加到
    标准

    • 将内容文件添加到netstandard项目(将其标记为
      嵌入式资源
      ,并将其设置为
      不复制

    • 从UWP项目添加对netstandard项目的引用

    Class1.cs

    public class Class1
    {
        public static Stream GetImage()
        {
            var assembly = typeof(Class1).GetTypeInfo().Assembly;
            Stream stream = assembly.GetManifestResourceStream("ClassLibrary1.timg.jpg");
            return stream;
        }
    }
    
    用法

    private async void Page_Loaded(object sender, RoutedEventArgs e)
    {           
        BitmapImage bitmap = new BitmapImage();
        var stream = Class1.GetImage();
        await bitmap.SetSourceAsync(stream.AsRandomAccessStream());
        MyImg.Source = bitmap;
    }
    

    由于在某些情况下这是可行的替代方案,所以进行了投票。不幸的是,将内容嵌入.dll并不总是理想的解决方案。例如#1嵌入式本机dll无法从内存加载,但必须先将其保存到磁盘。或者#2,如果需要动态加载大内容#3使用msbuild,我们可以使用通配符导入内容并使用条件编译规则。若添加到库中,您并没有真正回答为什么它在构建时被复制,但并没有被部署。如果使用相同的方法将内容直接添加到UWP项目中,它会在构建时被复制并部署。对于为什么它不会部署到AppX,我想到了这一点,但觉得我无法很好地解释它。msbuild以不同的方式处理不同的项目类型,在UWP中,标记为内容的文件被复制到AppX文件夹,然后绑定到AppX包中,但对于引用的库,该工具没有那么智能。。。但和你一样,我只是观察到了这一点,没有真正了解细节,也没有找到一些文档来备份观察结果。“这个工具没有那么聪明”,听起来像是一个bug。我想不出为什么内容被复制到UWP项目的build文件夹,但最终没有部署。我搜索了,但找不到解释此行为的文档。“内容文件已编译到Class.library.dll”我不确定您在这里的意思,但内容文件没有以任何方式编译。正如您所知,
    netstandard
    库最终将用作库对象。内容文件是对象的字段(
    ClassLibrary1.timg.jpg
    )。对象的字段?好的,为了澄清这一点,假设netstandard项目名为“ClassLibrary1”,内容文件名为“file1.jpg”。最终结果将是构建文件夹中的两个独立文件:“ClassLibrary1.dll”和“file1.jpg”。AppX文件夹中只有“ClassLibrary1.dll”;“file1.jpg”将丢失,并且未嵌入“ClassLibrary1.dll”中。注意:我正在考虑将“file1.jpg”标记为内容,而不是嵌入的资源!是的,我发现你已经在github上报告了这件事。相关团队已经打开了这条线索。请监视服务器的状态。
    private async void Page_Loaded(object sender, RoutedEventArgs e)
    {           
        BitmapImage bitmap = new BitmapImage();
        var stream = Class1.GetImage();
        await bitmap.SetSourceAsync(stream.AsRandomAccessStream());
        MyImg.Source = bitmap;
    }