文件的生成操作,属性如何设置(内容/嵌入资源等)
来源:互联网 发布:udp自定义端口号 编辑:程序博客网 时间:2024/06/06 20:15
原链接: http://www.cnblogs.com/zmlohw/p/5155662.html
(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题
链接:http://www.cnblogs.com/qinxg/archive/2012/07/17/2594503.html
在开发过程中遇到了图片加载器与视频播放器无法正常读取媒体资源的问题。
在代码中 图片路径是正确的,图片无法正常读出。而视频部分采取相同的代码,却可以正常读出。
读取图片代码如下:
读取视频代码如下:
(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题
其中2个的地址相似都为:/Assets/XXXX/XXX.XXX
读取图片错误信息如下:
后对比视频文件与图片文件时发现问题。
原来图片和视频的生成操作(build action)设置有差别。
视频的为:内容(content) 图片的为:Rescoure
查阅MSDN后发现,两种生成操作最后获取资源有很大的差异,并且对性能有很大影响。
首先介绍build action
Action
说明
None
资源既不会被集成到程序集内,也不会打包到xap包中。不过我们可以通过设置CopyToOutputDirectory选项让其自动拷贝到xap包所在目录。 这种情况下, 访问这个图片的相对Uri需要以"/"开始。
适用场景:在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用。 类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用。
Compile
不适合用于资源文件。类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件。
Content
资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。
Embedded Resource
这种方式会把文件嵌入到程序集中,Silverlight无法通过Uri引用在xaml和C#里对这个文件进行使用,微软不建议在Silverlight采用这种方式在程序集里嵌入资源。如果有这种需求可以用Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的Stream引用。
ApplicationDefinition
Silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"。其他文件都不适合用这个。
Page
不适合用于资源文件。所有的用户控件,页面和子窗体(Usercontrol/Page/Childwindow)的xaml文件应该采用的生成操作。 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件。 采用"Page" build action时xaml里的错误会导致工程无法正确生成。
CodeAnalysisDictionary
代码分析使用,Silverlight中可以忽略
Resource
资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。
SplashScreen
"SplashScreen"是这个选项是WPF的启动画面使用的。Silverlight启动加载画面是用的其他方式实现的,所以在Silverlight里不要用这个方式。
EntityDeploy
这个是EntityFramework采用的生成方式,在Silverlight里是没用。
需要关注的是,对于媒体资源通常使用Content与Resource两种不同的方式。
采取Content时,资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。
获取媒体资源方式:直接采用/文件夹/文件即可获取到资源文件。
采用Resource时,资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。
获取媒体资源方式:/{assemblyShortName};component/sl.png 的方式来获取,其中assemblyShortName为程序集名称。
本次问题中,针对图片文件使用了 Resource,而视频文件使用了Content。所以出现了上图问题。
在MSDN中说明,出于性能考虑,媒体资源需要设置为 内容(Content),说明如下:
对 Windows Phone 上的媒体处理进行优化以使用文件和网络流,而不是使用内存中的流。这意味着应用程序中包括的任何媒体文件(例如声音效果)应该将其“生成操作”设置为“内容”而不是“资源”。当媒体文件作为内容编译时,它会作为松散文件与应用程序文件 (.XAP) 一起存储,而不是存储在应用程序文件中。当媒体文件作为资源编译时,通常通过检索文件流来访问,这可能会降低性能。此外,当播放编译为内容的媒体文件时,会直接进行播放。当媒体文件作为资源编译时,播放之前需要将内容复制到 Windows Phone 上的文件,这会降低性能。
参考地址:http://msdn.microsoft.com/zh-cn/library/ff967560(v=VS.92).aspx
http://www.cnblogs.com/listenfly/archive/2011/11/03/2235059.html
- 文件的生成操作,属性如何设置(内容/嵌入资源等)
- 生成操作:内容|编译|与嵌入资源的区别
- C# 对于xml文件,对生成操作( 内容 编译 嵌入的资源)各个选项的差别,读写的差别
- 生成操作 嵌入资源
- 把项目中的xml文件的生成操作改为“嵌入的资源”,我在这个项目中怎么读取xml文件里的内容?
- 图片文件不是项目一部分或其"生成操作"属性未设置为“资源”
- 不是项目的一部分或其“生成操作”属性未设置为“资源”。
- 如何读取嵌入的资源
- attributesOfItemAtPath获取文件的大小、文件的内容等属性
- 内容与嵌入资源
- VS文件属性(无,编译,内容,嵌入的资源--改变发布网站时,某些文件目录不见了)
- PDF文件【由Latex、CTex或MS Word等生成】嵌入所有字体的快速解决方法
- BCB中嵌入资源文件的研究
- Silverlight编译错误,提示某文件不是项目的一部分或"生成操作"没有设置为"资源"
- delphi 将Dll等生成资源文件
- delphi 将Dll等生成资源文件
- uiautomator录音等操作生成的文件保存到手机指定文件中,然后如何判断是否存在
- C# 读取(嵌入资源文件)
- foreach循环
- poj 3071 Football (概率与期望DP)
- KVC和KVO的使用
- MethodHandle
- Mybatis SqlMapConfig.xml全局配置文件
- 文件的生成操作,属性如何设置(内容/嵌入资源等)
- JavaScript校验Number(4,1)格式的数字
- C++第二次实验博客
- Scala基于Akka的Remote Actor实现的简单RPC
- tomcat 下载及配置
- cocos JniHelper调用java时总是报 Failed to find static method id of
- struts学习(七)—拦截器概述
- 【Ubuntu 16】安装deb
- TCP会话开始与结束