【问题标题】:How can I retrieve an embedded xml resource?如何检索嵌入的 xml 资源?
【发布时间】:2009-02-06 03:02:31
【问题描述】:

我通过访问 Visual Studio 中的项目属性,然后使用资源 | 在我的类库中添加了一个 XML 文件作为嵌入资源。添加资源 |添加现有文件...

我尝试使用以下代码访问该文件,但一直返回空引用。有人有什么想法吗?

var path = Server.MapPath("~/bin/MyAssembly.dll");
var assembly = Assembly.LoadFile(path);
var stream = assembly.GetManifestResourceStream("MyNamespace.filename.xml");

【问题讨论】:

    标签: c# asp.net resources assemblies


    【解决方案1】:

    我发现在 Visual Studio 中使用项目属性对话框的“资源”选项卡要容易得多。然后通过以下方式生成对资源的强类型引用:

    Properties.Resources.Filename
    

    【讨论】:

      【解决方案2】:

      MSDN page for GetManifestResourceStream 做了这个注释:

      这个方法返回一个空引用 (在 Visual Basic 中没有)如果私有 另一个程序集中的资源是 已访问且调用者没有 ReflectionPermission 与 ReflectionPermissionFlag.MemberAccess 标志。

      您是否在程序集中将该资源标记为“公共”?

      【讨论】:

      • 我确实在程序集中将其标记为公开。仍然是一个空引用。
      • 可能与该文件的“构建操作”设置有关。您是否尝试将其更改为不同的值(例如嵌入式资源与内容)?
      • 我从未为文件设置构建操作。我只将文件导入到 .resx 文件中,无法提取其内容。摆脱 .resx 并将构建操作标记为“嵌入式资源”允许我使用上面的代码访问它。非常感谢您的提示!
      【解决方案3】:

      我发现这篇文章很好地解释了如何设置:http://www.devx.com/dotnet/Article/10831/1954

      在这种情况下可能有帮助的一件事是使用不同的方法来确定嵌入资源的位置。

      • GetEntryAssembly:使用此方法来引用为启动当前进程而运行的可执行文件。条目程序集是为 Windows 窗体应用程序设置的,但对于大多数其他应用程序(例如 Web 项目),GetEntryAssembly 返回“nothing”(或 null,在 C# 中)。
      • GetExecutingAssembly:使用此方法引用执行代码所在的同一程序集。
      • GetCallingAssembly:使用此方法来引用包含调用当前方法的代码的程序集。如果您编写通用代码来读取共享程序集中的嵌入式资源,而嵌入式资源位于调用程序集中,则此方法非常有用。

      我个人更喜欢这种方法而不是使用“资源”选项卡,因为它允许我使用其他工具将资源添加到项目中以包含在编译中。我不必通过这个工具使用 GUI

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多