如何获取嵌入在另一个项目中的资源

29

假设我有一个C#类库工程,该工程仅包含作为嵌入资源的xml文件。我想要从另一个解决方案工程中访问这些资源。由于“类”库不包含任何类,因此很难像这样获取程序集:

typeof(ClassName).Assembly ...

如何在不硬编码任何“魔法字符串”等的情况下最终获得嵌入式资源。有没有一种方法可以访问嵌入式资源?谢谢。

附言:

目前似乎只有这种方式可行:

var assembly = typeof(FakeClass).Assembly;
var stream = assembly.GetManifestResourceStream("Data.Blas.xml"); 
我在我的“data”程序集中创建了一个“虚假类”。
2个回答

20

你可以使用Assembly.GetManifestResourceStream()来从嵌入的程序集中加载 XML 文件。

System.IO.Stream s = this.GetType().Assembly.GetManifestResourceStream("ActivityListItemData.xml"); 

编辑

你可以使用 Assembly.Load() 方法加载目标程序集并从中读取资源。

Assembly.LoadFrom("Embedded Assembly Path").GetManifestResourceStream("ActivityListItemData.xml");

3
“this” 指的是当前执行的程序集,而不是其他程序集,因此这种方法行不通! - cs0815
你可以使用Assembly.Load()来加载包含嵌入式XML文件的程序集,然后读取它们。请查看更新。 - Kurubaran
7
从另一个项目中加载资源的内容没有得到清晰的解释(这是主要问题)。在“嵌入式程序集路径”中我们应该填写什么?是项目文件路径吗?还是相对路径?相对于哪里? - Matthieu Charbonnier

2

当我不想在项目中有松散的文件时,这里有一种方法我发现非常有效。它可以应用于任何程序集。

在下面的示例中,项目根目录下有一个名为'MyDocuments'的文件夹,里面有一个名为'Document.pdf'的文件。该文档被标记为嵌入资源。

您可以通过以下方式访问资源,先构建命名空间,然后调用GetManifestResourceStream()

Assembly assembly = Assembly.GetExecutingAssembly();
string ns = typeof(Program).Namespace;
string name = String.Format("{0}.MyDocuments.Document.pdf", ns);
using (var stream = assembly.GetManifestResourceStream(name))
{
    if (stream == null) return null;
    byte[] buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);
    return buffer;
}

我发现唯一的问题是当命名空间在'.'后面包含数字时(例如,MyDocuments.462),编译器会在数字前面添加下划线(因此,MyDocuments.462变为MyDocuments._462)。


我会更改 typeof(Program).Namespace,因为命名空间并不总是与项目名称相关联,在这些情况下它将无法找到文件。可以更改为 string name = assembly.GetManifestResourceNames().FirstOrDefault(n => n.Contains(".MyDocuments.Document.pdf")); - Arne H. Bitubekk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接