2013-07-10 41 views
14

Chúng ta hãy nói rằng tôi có một dự án thư viện lớp C#, mà chỉ chứa các file xml như nguồn lực nhúng. Tôi muốn truy cập các tài nguyên này từ một dự án giải pháp khác. Vì thư viện 'lớp' không chứa các lớp nên khó có thể lấy được assembly như sau:được nhúng tài nguyên trong một dự án khác

typeof(ClassName).Assembly ... 

để cuối cùng có được các tài nguyên nhúng. Có cách nào để truy cập tài nguyên được nhúng mà không cần phải mã hóa cứng bất kỳ chuỗi ma thuật nào không? Cảm ơn.

PS:

Điều này có vẻ là cách duy nhất có thể tại thời điểm này:

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

Tôi đã tạo ra một 'lớp học giả' trong lắp ráp 'dữ liệu' của tôi.

Trả lời

11

bạn có thể sử dụng Assembly.GetManifestResourceStream() để tải tệp xml từ hội đồng được nhúng.

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

EDIT

Bạn có thể sử dụng Assembly.Load() và nạp assembly mục tiêu và đọc các tài nguyên từ đó.

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

'this' sẽ là hội đồng thực thi nhưng không phải là phiên bản khác để điều này sẽ không hoạt động! – cs0815

+0

bạn có thể sử dụng Assembly.Load() để tải lắp ráp của bạn trong đó có các tập tin xml nhúng và sau đó đọc chúng, Xem cập nhật. – Kurubaran

+1

rất nhiều chuỗi ma thuật không tốt. – cs0815

0

Dưới đây là một cách tiếp cận tôi thấy hoạt động khá tốt khi tôi không muốn file lỏng lẻo trong dự án. Nó có thể được áp dụng cho bất kỳ hội đồng nào.

Trong ví dụ sau có một thư mục trong thư mục gốc của dự án có tên 'MyDocuments' và tệp có tên 'Document.pdf' bên trong. Tài liệu được đánh dấu là tài nguyên được nhúng.

Bạn có thể truy cập vào tài nguyên như thế này, việc xây dựng các không gian tên đầu tiên trước khi gọi 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; 
} 

Vấn đề duy nhất mà tôi đã tìm thấy là khi không gian tên chứa số sau một '' (ví dụ: MyDocuments.462). Khi một không gian tên là một số trình biên dịch sẽ thêm một dấu gạch dưới (vì vậy MyDocuments.462 trở thành MyDocuments._462).

Các vấn đề liên quan