Как распаковать упакованную сборку Fody.Costura

Мой друг дал мне возможность распаковать сборку, которая была упакована с Fody.Costura. Сборка имеет dll-зависимость, которая была встроена в качестве ресурса. Я попытался извлечь этот.zip ресурс с помощью dotPeek и распаковать его с помощью этого кода здесь

public static void Decompress(string path)
{
    using (var stream = File.OpenRead(path))
    using (var compressStream = new DeflateStream(stream, CompressionMode.Decompress))
    {
        compressStream.Seek(0, SeekOrigin.Begin);
        var fs = File.Create(path + ".decompressed");
        compressStream.CopyTo(fs);
        fs.Close();
    }
}

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

Есть ли подходящее решение для распаковки этого упакованного DLL?

1 ответ

Решение

Код, который Costura использует для распаковки этих ресурсов, находится здесь.

https://github.com/Fody/Costura/blob/master/src/Costura.Template/Common.cs

static void CopyTo(Stream source, Stream destination)
{
    var array = new byte[81920];
    int count;
    while ((count = source.Read(array, 0, array.Length)) != 0)
    {
        destination.Write(array, 0, count);
    }
}

static Stream LoadStream(string fullname)
{
    var executingAssembly = Assembly.GetExecutingAssembly();

    if (fullname.EndsWith(".zip"))
    {
        using (var stream = executingAssembly.GetManifestResourceStream(fullname))
        using (var compressStream = new DeflateStream(stream, CompressionMode.Decompress))
        {
            var memStream = new MemoryStream();
            CopyTo(compressStream, memStream);
            memStream.Position = 0;
            return memStream;
        }
    }

    return executingAssembly.GetManifestResourceStream(fullname);
}

Это мой простой код консольного приложения C# (Framework 4), который я использую просто путем "перетаскивания" (сжатые Costura) файлов поверх скомпилированного (ConsoleApp1) исполняемого файла.

using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
  class Program
  {
    static void CopyTo(Stream source, Stream destination) {
      int count;
      var array = new byte[81920];
      while ((count = source.Read(array, 0, array.Length)) != 0) {
        destination.Write(array, 0, count);
      }
    }

    static Stream LoadStream(string fullname) {
      FileStream stream = default(FileStream);
      if (fullname.EndsWith(".zip")) {
        using (stream = new FileStream(fullname, FileMode.Open)) {
          using (var compressStream = new DeflateStream(stream, CompressionMode.Decompress)) {
            var memStream = new MemoryStream();
            CopyTo(compressStream, memStream);
            memStream.Position = 0;
            return memStream;
          }
        }
      }
      return stream;
    }

    static void Main(string[] args) {
      Stream stream; Stream file;
      string RefilePath = @"^.+[^\\]+\\"; string fullname; string newFile;
      for (int i = 0; i < args.Count(); i++) {
        fullname = args[i];
        newFile = Regex.Replace(fullname, "\\.zip$", string.Empty);
        Console.Write("{0} -> {1}\r\n",
          Regex.Replace(fullname, RefilePath, string.Empty),
          Regex.Replace(newFile, RefilePath, string.Empty));
        try
        {
          stream = LoadStream(fullname);
          using (file = File.Create(newFile)) {
            CopyTo(stream, file);
          }
        }
        catch (Exception ex) {
          Console.Write("{0}", ex.ToString());
        }
      }
    }
  }
}

На основе ответа Кэмерона МакФарланда

Этот проект предназначен для распаковки этих ресурсов.

Другие вопросы по тегам