2013-07-10 13 views
14

私は埋め込みリソースとしてxmlファイルのみを含むC#クラスライブラリプロジェクトがあるとしましょう。他のソリューションプロジェクトからこれらのリソースにアクセスしたいと思います。最終的に埋め込まれたリソースを取得する埋め込みリソースを別のプロジェクトに取得

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"); 

EDITあなたはAssembly.Load()を使用してターゲットアセンブリをロードし、そこからリソースを読み込むことができます。

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

'this'は実行アセンブリですが、他のアセンブリは動作しません。 – 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になります)。

関連する問題