26

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

typeof(ClassName).Assembly ...

最终获得嵌入式资源。有没有办法无需硬编码任何魔术字符串等即可访问嵌入式资源?谢谢。

PS:

这似乎是目前唯一可行的方法:

var assembly = typeof(FakeClass).Assembly;
var stream = assembly.GetManifestResourceStream("Data.Blas.xml"); 

我在我的“数据”程序集中创建了一个“假类”。

4

2 回答 2

21

您可以使用Assembly.GetManifestResourceStream()从嵌入式程序集中加载 xml 文件。

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

编辑

您可以使用 Assembly.Load() 并加载目标程序集并从那里读取资源。

Assembly.LoadFrom("Embedded Assembly Path").GetManifestResourceStream("ActivityListItemData.xml");
于 2013-07-10T12:03:54.973 回答
1

当我不希望项目中有松散的文件时,我发现这是一种非常有效的方法。它可以应用于任何组件。

在以下示例中,项目的根目录中有一个名为“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)。

于 2017-05-16T15:14:00.803 回答