2013-07-10 15 views
14

Powiedzmy, że mam projekt biblioteki klas C#, który zawiera tylko pliki xml jako zasoby osadzone. Chciałbym uzyskać dostęp do tych zasobów z innego projektu rozwiązania. Ponieważ biblioteka „klasa” nie zawiera żadnych klas jest to dość trudne do uzyskania zespół tak:pobierz zasób osadzony w innym projekcie

typeof(ClassName).Assembly ... 

aby w końcu dostać się do zasobów osadzonych. Czy istnieje sposób na uzyskanie dostępu do zasobów osadzonych bez konieczności pisania na sztywnych łańcuchach itp.? Dzięki.

PS:

Wydaje jedyny możliwy sposób w tej chwili:

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

Stworzyłem klasę „fałszywy” w moim zespole „dane”.

Odpowiedz

11

możesz użyć Assembly.GetManifestResourceStream(), aby załadować plik xml z osadzonego zestawu.

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

EDIT

Można użyć Assembly.Load() i załadować zespół docelowy i odczytać zasobu stamtąd.

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

"To" byłoby zgromadzeniem wykonującym, ale nie tym drugim, więc to by nie zadziałało! – cs0815

+0

można użyć Assembly.Load(), aby załadować zespół, który ma osadzone pliki xml, a następnie je przeczytać, Zobacz zaktualizowane. – Kurubaran

+1

wiele magicznych strun nie jest dobre. – cs0815

0

Oto podejście uważam działa całkiem dobrze, kiedy nie chcę luźne pliki w projekcie. Można go zastosować do dowolnego zestawu.

W poniższym przykładzie znajduje się folder w katalogu głównym projektu o nazwie "MyDocuments" i plik o nazwie "Document.pdf". Dokument jest oznaczony jako zasób osadzony.

Można uzyskać dostęp do zasobu takiego, obecnie budynek przestrzeń nazw pierwszy przed wywołaniem 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; 
} 

Jedynym problemem znalazłem jest, gdy przestrzeń nazw zawiera numery po „” (np. MyDocuments.462). Kiedy przestrzeń nazw jest liczbą, kompilator będzie poprzedzał podkreślenie (więc MyDocuments.462 stanie się MyDocuments._462).

Powiązane problemy