2012-06-24 35 views
4

如何將程序集保存到文件?即我的意思不是動態組裝,而是「正常」的內存組件。如何將程序集保存到磁盤?

Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (Assembly ass1 in asslist) 
{ 
    // How to save? 
} 

當應用程序從資源加載一些引用的程序集時,可能會出現這種情況。我想將它們保存到磁盤。

由於它們在那裏被加密,所以不可能提取程序集表單資源。

+10

+1,如果僅用於使用「assList」。 – Iridium

+2

這沒有任何意義。也不可能。從資源中讀取程序集並使用File.WriteAllBytes()保存它當然簡單得多。或者只是不把它放在首位的資源。 –

+3

爲什麼你想要保存驢到磁盤?這是他們從哪裏加載的。你不能只是找出路徑,然後複製它們? – stakx

回答

0

如何嘗試序列化程序集?這是serializable

+0

這不會序列化代碼。它序列化名稱。 – usr

0

您需要找到您的ass[...]es來自的路徑。您可以這樣找到它:

Assembly ass = ...; 
return ass.Location; 

通知書的,as是一個關鍵字,不能用作標識符。我建議使用ass

+0

我無法找到路徑,因爲tehse程序集已加密並處於資源中。應用程序將它們加載到「解決事件」上。屬性'位置'由於包含不可打印的字符而不可讀取 – Oleg

0

從格雷格羅斯的想法我開發了這個小片段。 請注意,我試圖堅持命名約定。

public void SaveAllAssemblies() 
{ 
    Assembly[] asslist = AppDomain.CurrentDomain.GetAssemblies(); 
    foreach (Assembly ass in asslist) 
    { 
     FileInfo fi = new FileInfo(ass.Location); 

     if (!fi.Extension.Equals(".exe", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var assName = fi.Name; 
      var assConverter = new FormatterConverter(); 
      var assInfo = new SerializationInfo(typeof(Assembly), assConverter); 
      var assContext = new StreamingContext(); 

      using (var assStream = new FileStream(assName, FileMode.Create)) 
      { 
       BinaryFormatter bformatter = new BinaryFormatter(); 
       ass.GetObjectData(assInfo, assContext); 

       bformatter.Serialize(assStream, assInfo); 
       assStream.Close(); 
      } 
     } 
    } 
} 

但是一些程序集沒有標記爲可序列化,例如mscorlib.dll。 因此,這可能只是一個部分解決方案?

儘管有可能連載一些組件,我建議使用 的FileInfo作爲例子提供,生成列表,並檢查 組件。

+0

我在我的測試應用程序(exe和我的程序集)中試過這種方式。我試圖序列化我的程序集。 mscorlib,版本= 4.0.0.0,Culture = neutral,PublicKeyToken ='中的bformatter.Serialize()調用:[System.Runtime.Serialization.SerializationException] = {「Type'System.Runtime.Serialization.SerializationInfo' b77a5c561934e089'未標記爲可序列化。「} – Oleg

+0

正如代碼示例中的行所述。 –