2012-06-24 4 views
4

Как сохранить сборку в файл? То есть Я имею в виду не динамическую сборку, а «нормальные» сборки в памяти.Как сохранить сборку на диск?

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

Эта ситуация может возникнуть, когда приложение загружает некоторые ссылочные сборки из ресурсов. Я хочу сохранить их на диск.

Невозможно извлечь ресурсы сборок, потому что они зашифрованы там.

+10

+1, если только для использования «assList». – Iridium

+2

Это не имеет никакого смысла. Это также невозможно. Конечно, гораздо проще просто прочитать сборку из ресурса и сохранить ее с помощью File.WriteAllBytes(). Или просто не помещайте его в ресурс в первую очередь. –

+3

Зачем вам нужно сохранять задницу [...] es на диск? Вот откуда они были загружены. Не могли бы вы просто выяснить пути, а затем скопировать их? – stakx

ответ

0

Как насчет попытки сериализации сборки? Это serializable.

+0

Это не сериализует код. Он сериализует имя. – usr

0

Вам необходимо найти путь, по которому вышли ass[...]es. Вы можете найти его, как это:

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

Обратите внимание, что as является ключевым словом и не может быть использована в качестве идентификатора. Я рекомендую использовать ass.

+0

Я не могу найти пути, потому что сборки tehse зашифрованы и в ресурсах. Приложение загружает их в «событие разрешения». Свойство 'Location' нечитабельно, потому что содержит непечатаемые символы – 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 и моей сборке). Я попытался сериализовать свою сборку. Ошибка на bformatter.Serialize() call: [System.Runtime.Serialization.SerializationException] = {"Тип 'System.Runtime.Serialization.SerializationInfo' в Assembly 'mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 'не помечен как сериализуемый. "} – Oleg

+0

, как указано в строке под примером кода. –

Смежные вопросы