2009-04-02 28 views
16

Tôi đã lắp ráp một nơi nào đó trên hệ thống tệp, ví dụ: "C: \ temp \ test.dll". Trong hội đồng đó có một ResourceDictionary, ví dụ: "abc.xaml".Tải một ResourceDictionary từ một assembly

Làm cách nào tôi có thể nhận được tài nguyên đó? Có lẽ có một cách sử dụng Reflections? Tôi đã không tìm thấy một giải pháp cho đến nay.

Cảm ơn trước!

Chỉnh sửa: Chỉ muốn thêm rằng tôi muốn truy cập Tài nguyên trong Từ điển, ví dụ: một phong cách.

Trả lời

10

Edit: Tôi tìm thấy một giải pháp tốt hơn mà làm việc với ResourceDictionaries:

Assembly.LoadFrom(@"C:\temp\test.dll"); 
ResourceDictionary rd = new ResourceDictionary(); 
rd.Source = new Uri("/test;component/myresource.xaml"); 

Vâng, tôi không thể có được nó để làm việc với ResourceDictionaries, vì vậy tôi đang sử dụng Thay vào đó, hãy làm theo cách của tôi:

Assembly a = Assembly.LoadFile(@"C:\temp\test.dll"); 
ResourceManager rm = new ResourceManager("NameOfResource", a); 
object o = rm.GetObject("xyz"); 

Bạn có thể nhận được "NameOfResource" với Reflector, như Ian đã đề xuất.

+3

+ 1 luôn luôn tốt để trở lại và cho chúng tôi biết làm thế nào bạn nhận được về với vấn đề của bạn :) –

+0

Xem câu trả lời của Claraoscura, nó là một giải pháp tốt hơn. – scobi

+0

Bạn đang thiếu 'UriKind' trong câu trả lời của mình, nếu bạn đang sử dụng đường dẫn tương đối, bạn nên cung cấp tài liệu' UriKind.Relative' – ANewGuyInTown

2

Lấy một bản sao của Reflector (Lutz đã bàn giao điều này bây giờ). Sử dụng điều đó để xem xét việc lắp ráp và không gian tên vv của các tài nguyên trong đó.

Sau đó đọc trong tài nguyên nhúng như thế này;

Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); 
using (System.IO.Stream s = asm.GetManifestResourceStream(<yourname>) 
{ 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(s)) 
    { 
     string xml = reader.ReadToEnd(); 
    } 
} 
+0

Cảm ơn bạn. Thật không may, khi tôi sử dụng mã của bạn, tôi chỉ nhận được rác từ reader.ReadToEnd() –

+0

Tôi không có ý tưởng gì XAML trông như thế, nhưng tôi đoán bạn cần một bộ giải mã của một số loại? –

+0

Tôi không biết, nhưng bây giờ tôi đã làm với các tệp tài nguyên. Cảm ơn bạn đã giúp đỡ! –

21

Bạn thực sự cần phải viết các Uri như thế này:

Assembly.LoadFrom(@"C:\temp\test.dll"); 
ResourceDictionary rd = new ResourceDictionary(); 
rd.Source = new Uri(@"pack://application:,,,/test;component/myresource.xaml"); 
+5

cho cú pháp goofy Uri ở đây: http://msdn.microsoft.com/vi -us/library/aa970069.aspx – scobi

+1

+1 Truyền thuyết của bạn, hoạt động hoàn hảo –

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