2010-01-12 42 views
1

觀察下面這段代碼的Silverlight:Silverlight是否有可能在不加載完整程序集的情況下讀取程序集清單?

foreach (AssemblyPart ap in Deployment.Current.Parts) 
{ 
    var sri = Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative)); 
    var assembly = new AssemblyPart().Load(sri.Stream); 
    // Do something with the assembly. 
} 

它遍歷所有可用的應用程序組件並執行對他們的東西。這段代碼的問題在於,即使只是讀取程序集清單,代碼也會將完整的程序集加載到進程空間中。

是否有可能以某種方式優化呢?

我也有類似的.NET代碼,它使用PostSharp.Core圖書館只是閱讀組裝體現,而不加載完整的組件(Mono.Cecil能做到的工作也一樣)。

在此先感謝所有的好心人那裏。

回答

0

正如你可以在任何.NET代碼做:

foreach (AssemblyPart ap in Deployment.Current.Parts) 
{ 
    byte[] buffer = new byte[1024]; 
    List<byte> assemblyBytes = new List<byte>(); 

    using (var sri = Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative)).Stream) 
    { 
     int read = -1; 
     do 
     { 
      read = sri.Read(buffer, 0, buffer.Length); 
      if (read != -1) 
      { 
       Array.Resize(ref buffer, read); 
       assemblyBytes.AddRange(buffer); 
      } 
     } 
     while (read != -1); 
    } 

    var assembly = Assembly.ReflectionOnlyLoad(assemblyBytes.ToArray()); 
    // Do something with the assembly.  
} 

編輯補充

這裏的技巧是用mscorlib [2.0.0.0]更換參考mscorlib [2.0.5.0]達到你所需要的。

但是,如果你爲了做到這一點創建一個分開組裝的,因爲更換引用可能搞砸了你的代碼的其他部分它會更好。

+0

只有一個小問題 - Silverlight平臺沒有Assembly.ReflectionOnlyLoad方法。 – mark 2010-01-12 14:19:45

+0

確實,它位於'System.Reflection'命名空間中。 Silverlight是建立在.NET平臺之上的。 – 2010-01-12 14:32:55

+0

@Paulo,你有沒有試過在Silverlight類庫中編譯你的代碼?請嘗試,如果你沒有,然後相應地改變你的答覆。 – mark 2010-01-12 14:40:11

0

沒有內置的方式做到這一點在Silverlight框架。您可以嘗試查看諸如CecilMicrosoft's Common Compiler Infrastructure - Metadata項目以嘗試在SL中運行這些項目。這樣做肯定需要重新編譯,而且我不確定任何依賴關係。除此之外,你將剩下實現你自己的代碼來解析彙編字節。這樣做並不是因爲內心的淡漠,而是需要我提到的兩個項目的重要來源重複。

相關問題