如何将资源嵌入到另一个项目中

本文关键字:另一个 项目 资源 | 更新日期: 2023-09-27 18:21:44

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

typeof(ClassName).Assembly ...

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

PS:

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

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

我在"数据"程序集中创建了一个"伪类"。

如何将资源嵌入到另一个项目中

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

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

编辑

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

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

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

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