解决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代码。

3 Responses to “解决Windows Phone平台上不能枚举工程自带资源的问题”

  1. laoyur说道:

    感谢思维哥,真的是好方案。
    不过对于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;
    }

    • Si Wei说道:

      好棒的方法,谢谢!
      原来用ResourceManager::GetResourceSet()前还需要先GetStream,这谁想得到啊(怒)。
      不过貌似这个方法只能对付存在Assembly里面的Resource资源?

  2. […] 哇靠,许久不搞瘟屁的代码,居然连这都忘了,哈哈,太特么丢人了 回复laoyur: 如何枚举Resource类型的文件: http://wei.si/blog/2012/06/windo … resources-solution/ […]