2012-07-21 88 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