从.net库中读取文本文件资源

时间:2012-07-21 08:13:08

标签: c# .net mef

我有一个用于wpf mef应用程序的库。此库中包含许多文件。其中一个是app.js。

如何从库中读取app.js作为字符串。

PS:从早期的代码中,我可以使用以下代码访问/创建位图图像:

private readonly BitmapImage _starImageSmall = new BitmapImage(new Uri("pack://application:,,,/MyFirstExtension;component/Star_16x16.png", UriKind.Absolute));

生成Uri之后,如何以系统流的形式访问流?

2 个答案:

答案 0 :(得分:4)

这段代码从未让我失望过:

private Stream GetEmbeddedResourceStream(string resourceName)
{
    Assembly assy = Assembly.GetExecutingAssembly();
    string[] res = assy.GetManifestResourceNames();
    for (int i = 0; i < res.Length; i++)
    {
        if (res[i].ToLower().IndexOf(resourceName.ToLower()) != -1)
        {
            return assy.GetManifestResourceStream(res[i]);
        }
    }
    return Stream.Null;
}

此代码块需要注意三件事:

  • 此块适用于执行程序集Assembly.GetExecutingAssembly()),调用程序集或任何其他程序集;改变它以满足您的需求(见下文替代)
  • resourceName应该只是文件名(例如,如果您的文件保存在resources/myRes.bin,则致电GetEmbeddedResourceStream("myRes.bin")
  • 您的资源必须将其“资源类型”设置为“嵌入资源”

但是,如果您希望代码可以处理任意程序集,则可以将代码块更改为:

private Stream GetEmbeddedResourceStream(string resourceName)
{
    return GetEmbeddedResourceName(resourceName, Assembly.GetExecutingAssembly());
}
private Stream GetEmbeddedResourceStream(string resourceName, Assembly assembly)
{
    string[] res = assembly.GetManifestResourceNames();
    for (int i = 0; i < res.Length; i++)
    {
        if (res[i].ToLower().IndexOf(resourceName.ToLower()) != -1)
        {
            return assembly.GetManifestResourceStream(res[i]);
        }
    }
    return Stream.Null;
}

答案 1 :(得分:1)

您可以使用Assembly.GetManifestResourceStream在程序集中打开资源流。如果您不确定资源的名称,可以使用Assembly.GetManifestResourceNames枚举资源名称。