.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本机工具链)
我在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项目的引用
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;
}