解决Windows Phone平台上不能枚举工程自带资源的问题
Windows Phone开发中内置(built-in)资源文件的编译方式(build action)主要有Content和Resource两种,想必具体的区别做过相关开发的同学都了解(不了解的看WP7 working with Images: Content vs Resource build action)。但不管是放在XAP内引用还是dll内引用,都无法进行枚举,这就带来了很大的不方便:预置的资源都必须硬编码在代码内才能引用或者转移到Isolated Storage中。
今天在参考PhoneGap开发框架时偶然发现了一个很妙的方法,一劳永逸解决问题。
它的思路是执行预编译命令,利用一个JScript脚本遍历工程下某文件夹所有文件,生成为XML文件。程序中则读取这个文件一一将资源读入。具体步骤:
1. 到PhoneGap的Github页面上下载BuildManifestProcessor.js。
2. 根据需要修改生成的xml文件名和节点名。
3. 右键选择项目属性-Build Events,在Pre-build event command line里面加上
CScript "$(ProjectDir)/BuildManifestProcessor.js" "$(ProjectPath)"
4. 在程序中读入生成的xml,代码可以参考CordovaView.xaml.cs的GapBrowser_Loaded()方法。
另外需要注意的是,确保cscript.exe可以执行。有的机器上可能为了安全禁止直接执行JScript代码。
15 6月 2012 in 程序
Comments [3]
感谢思维哥,真的是好方案。
不过对于Resource方式嵌入dll的资源,还是可以枚举到的,对于文件方式的应该也行,解压xap来获取文件列表?
以下是我使用的代码,供思维哥参考。思路来源于M$官方论坛,具体地址不记得了。
private static List EnumerateResourceImagesInMainAssembly()
{
Assembly mainAssem = Assembly.Load(“yourMainAssemblyName”);
string[] resources = mainAssem.GetManifestResourceNames();
ResourceManager rm = new ResourceManager(resources[0].Replace(“.resources”, “”), mainAssem); //All resources has “.resources” in the name – so I have to get rid of it
//注意:所有文件名都应该用小写
Stream DUMMY = rm.GetStream(“app.xaml”); //Seems like some issue here, but without getting any real stream next statement doesn’t work….
ResourceSet rs = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, false, true);
IDictionaryEnumerator enumerator = rs.GetEnumerator();
List list = new List();
while (enumerator.MoveNext())
{
//注意文件名用小写
if (((string)enumerator.Key).StartsWith(“yourImgFolder/”))
list.Add((string)enumerator.Key);
}
rs.Dispose();
DUMMY.Dispose();
return list;
}
好棒的方法,谢谢!
原来用ResourceManager::GetResourceSet()前还需要先GetStream,这谁想得到啊(怒)。
不过貌似这个方法只能对付存在Assembly里面的Resource资源?
[…] 哇靠,许久不搞瘟屁的代码,居然连这都忘了,哈哈,太特么丢人了 回复laoyur: 如何枚举Resource类型的文件: http://wei.si/blog/2012/06/windo … resources-solution/ […]