2015-05-21 3 views
0

Пожалуйста, проверьте ссылку «Изображение», мне нужно извлечь содержимое ресурса из файла MSIL. Я отлаживал файл, используя ILSpy, но мне нужно сделать это любым другим способом. с использованием любого ручного вмешательства.Как извлечь содержимое для репозитория из файлов MSIL или .NET PE

http://i.stack.imgur.com/ZQdRc.png

+0

Что вы на самом деле пытаетесь достичь? Вы пытаетесь сделать это с помощью кода? Почему недостаточно ILSpy? – vcsjones

+0

Мне нужно извлечь больше файлов около 20+. Я не могу открыть все файлы в ILspy и извлечь их вручную. Требуется любой тип командной строки. Например. Extracter.exe

ответ

0

Вы можете сделать это с чем-то вроде:

public class LoadAssemblyInfo : MarshalByRefObject 
{ 
    public string AssemblyName { get; set; } 

    public Tuple<string, byte[]>[] Streams; 

    public void Load() 
    { 
     Assembly assembly = Assembly.ReflectionOnlyLoad(AssemblyName); 

     string[] resources = assembly.GetManifestResourceNames(); 

     var streams = new List<Tuple<string, byte[]>>(); 

     foreach (string resource in resources) 
     { 
      ManifestResourceInfo info = assembly.GetManifestResourceInfo(resource); 

      using (var stream = assembly.GetManifestResourceStream(resource)) 
      { 
       byte[] bytes = new byte[stream.Length]; 
       stream.Read(bytes, 0, bytes.Length); 

       streams.Add(Tuple.Create(resource, bytes)); 
      } 
     } 

     Streams = streams.ToArray(); 
    } 
} 

// Adapted from from http://stackoverflow.com/a/225355/613130 
public static Tuple<string, byte[]>[] LoadAssembly(string assemblyName) 
{ 
    LoadAssemblyInfo lai = new LoadAssemblyInfo 
    { 
     AssemblyName = assemblyName, 
    }; 

    AppDomain tempDomain = null; 

    try 
    { 
     tempDomain = AppDomain.CreateDomain("TemporaryAppDomain"); 
     tempDomain.DoCallBack(lai.Load); 
    } 
    finally 
    { 
     if (tempDomain != null) 
     { 
      AppDomain.Unload(tempDomain); 
     } 
    } 

    return lai.Streams; 
} 

использовать его как:

var streams = LoadAssembly("EntityFramework"); 

streams является массивом Tuple<string, byte[]>, где Item1 это имя ресурса и Item2 - это двоичный контент ресурса.

Это является довольно сложным, так как это делает Assembly.ReflectionOnlyLoad в другом AppDomain, который затем выгружается (AppDomain.CreateDomain/AppDomain.Unload).