在运行时访问资源

时间:2011-03-16 19:49:22

标签: c# silverlight silverlight-4.0

我有一个XML文件作为Silverlight 4.0项目的一部分,我想在运行时访问它。我将文件保存在名为Resources的目录中,其中Build Action设置为“Content”,Copy to Output Directory设置为“Do not copy”。如果我解压缩XAP文件,我会在我期望的位置看到XML文件,但我不确定如何从代码中引用它。我目前有以下内容:

Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"/AssemblyName;component/Resources/MyFile.xml")

不幸的是,在运行上面的代码后,stream为null。除了上面提到的路径之外,我还尝试过“/Resources/MyFile.xml”,“/ MyFile.xml”和“MyFile.xml”,但它们都会遇到相同的行为。

在Silverlight应用程序中访问作为资源嵌入的XML文件的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

具有构建操作“Content”的资源只是嵌入到xap文件中,具有与应用程序相同的相对目录结构。它不会作为资源嵌入到程序集中。

当设置为构建操作“内容”时,您应该能够使用类似(或任何适合您需要的)加载文件:

XElement.Load(<relative directory>/<file>)

您当前使用的方法(使用资源流)用于嵌入资源(其构建操作设置为“资源”)。对于那些,虽然我还没有尝试过你的方法,但通常你会使用

来获取资源
Application.GetResourceStream

答案 1 :(得分:1)

我使用下面的代码片段来访问drawables。不确定它是否完全相关,但希望这会给你一种暗示......

Resources res = getResources();
spec = tabHost.newTabSpec("groups").setIndicator("Groups", res.getDrawable(R.drawable.ic_tab_groups)).setContent(intent);

答案 2 :(得分:1)

正如Willem van Rumpt所提到的,“内容”资源不是通常的资源(它们不存储在汇编中)。我已经检查了this article 并且根本找不到你可以引用资源,从其他程序集标记为“内容”。

所以,你有两个选择:

  1. 将XML定义为嵌入式资源
  2. 将XML定义为资源
  3. 在第一种情况下,流请求看起来像:

            var a = Assembly.Load("AssemblyName");
            var s = a.GetManifestResourceStream(@"DefaultNamespace.Resources.XMLFile2.xml");
    

    在第二种情况下:

            var a = Assembly.Load("AssemblyName");
            var rm = new ResourceManager("AssemblyName.g", a);
            using (var set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true))
            {
                var ums = (UnmanagedMemoryStream)set.GetObject(@"Resources/XMLFile1.xml", true);
            }
    

    希望这会有所帮助。