2012-07-21 51 views
2

我有一个用于wpf mef应用程序的库。包含在这个库中的是一些文件。其中之一是app.js.从.net库读取文本文件资源

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

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

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

产生的Uri后,我如何才能访问流作为系统流?

+0

您提到它是MEF应用程序。这是否意味着您希望通过MEF导出来使这些资源文件可用?目前,我在下面的答案中忽略了MEF,因为它不清楚它是如何(或应该)涉及的。 – 2012-07-21 20:28:55

+0

@WimCoenen不,我实际上正在为WebMatrix编写一个扩展,因为它正在使用MEF,所以我认为有必要提及它。科尔和你的解决方案都给了我我需要的东西。 – ritcoder 2012-07-22 09:53:40

回答

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; 
} 
+0

工程很棒。函数结尾处的返回语句是否有任何理由? – ritcoder 2012-07-22 09:51:30

+0

@ritcoder所以编译器不会抛出一个合适的,如果该文件不存在 – 2012-07-22 16:02:42

+0

辉煌!我注意到,在我的图书馆项目中,文件需要是“嵌入式资源”。我尝试过“内容”和“资源”,但都没有成功。 – Hong 2014-12-16 12:21:13