2

我有一个在 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 后,如何作为系统流访问流?

4

2 回答 2

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;
}
于 2012-07-21T22:58:35.087 回答
1

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

于 2012-07-21T20:15:27.000 回答