2013-07-10 114 views
14

讓我們說我有一個C#類庫項目,它只包含xml文件作爲嵌入式資源。我想從另一個解決方案項目訪問這些資源。由於'類'庫不包含類,因此很難獲得像這樣的程序集:在另一個項目中獲得嵌入式資源

typeof(ClassName).Assembly ... 

最終會獲得嵌入式資源。有沒有辦法獲得嵌入式資源,而不必硬編碼任何魔術字符串等?謝謝。

PS:

這似乎可能在目前的唯一途徑:

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

我在「數據」組件創建了一個「假類」。

回答

11

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

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

編輯

您可以使用Assembly.Load()和加載目標組件,並從那裏讀取資源。

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

'這'將執行組件,但不是另一個,所以這是行不通的! – cs0815

+0

您可以使用Assembly.Load()加載具有嵌入式xml文件的程序集,然後讀取它們,請參閱更新。 – Kurubaran

+1

很多魔術串不好。 – cs0815

0

說明這裏是一個方法,我覺得效果很好,當我不想在項目鬆散文件的方式。它可以應用於任何組件。

在下面的例子中,項目的根目錄中有一個名爲'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._462)。

相關問題