Запуск приложения .Net из сжатого файла "zip" - PullRequest
2 голосов
/ 20 марта 2011

Мне нужно создать легкое приложение .Net, которое можно легко распространять (например, через вложение электронной почты). Я могу запустить EXE из ZIP-файла, однако, похоже, что при запуске из ZIP-файла EXE-файл не может ссылаться на какие-либо внешние файлы конфигурации (например, exe.config или любой другой файл XML).

Разве невозможно запустить EXE из zip-файла, когда этот EXE использует данные из файла exe.config?

Я уже рассмотрел этот вопрос:

.NET-приложение Windows, можно ли его сжать в один .exe?

но я думаю, что он пытается решить проблему, отличную от меня.

Я считаю, что моя проблема похожа на это: Обернуть файлы в один исполняемый пакет

Однако ответы на этот вопрос дали четкое решение.

Ответы [ 2 ]

4 голосов
/ 20 марта 2011

Возможно ли это?Что ж, давайте посмотрим на ситуацию здесь.

Zip - это формат архива.Он не указывает магическое число ;вместо этого zip-файл идентифицируется наличием отмеченных записей (zip-записей), присутствующих в любом месте файла.

В Windows EXE - это формат файла, определяемый магическим числом.Это позволяет включать в файл произвольные данные и специально отмеченные места.

Комбинируя их, можно получить как исполняемый файл, так и почтовый индекс.Эта возможность используется для создания самораспаковывающихся zip-файлов (SFX) : исполняемого файла, который считывает себя как zip-файл и извлекает записи, содержащиеся в нем.SFX в основном состоит из некоторой «заглушки» exe-логики, которая знает, как читать и извлекать любой zip-файл, плюс переменный набор записей zip-записей.

Ваше требование - формат архива, который извлекает себя, а затем запускает определенный файл из извлеченного содержимого, - требует SFX-заглушку, которая только на немного более способна , чем стандартная.Он должен извлечь файлы, а затем запустить один из этих файлов.

DotNetZip - это zip-библиотека на основе .NET, которая позволяет вашему приложению .NET создавать zip-файлы, включая SFX-файлы.SFX-заглушка, предоставляемая DotNetZip, включает возможность вызова одного из извлеченных файлов после извлечения.Команда для запуска после извлечения не обязательно должна быть исполняемой .NET, но это может быть.Конечно, поскольку exe и его конфигурационный файл были извлечены, exe может успешно работать с доступом к файлу .config.Это должно соответствовать вашим требованиям.

В коде, использующем DotNetZip для создания SFX, который запускает команду после извлечения, выглядит следующим образом:

string DirectoryPath = "c:\\Documents\\Project7";
using (ZipFile zip = new ZipFile())
{
    zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath));
    zip.Comment = "This will be embedded into a self-extracting console-based exe";
    SelfExtractorOptions options = new SelfExtractorOptions();
    options.Flavor = SelfExtractorFlavor.ConsoleApplication;
    options.DefaultExtractDirectory = "%USERPROFILE%\\ExtractHere";
    options.PostExtractCommandLine = "%USERPROFILE%\\ExtractHere\\MyApp.exe";
    options.RemoveUnpackedFilesAfterExecute = true;
    zip.SaveSelfExtractor("archive.exe", options);
}

DotNetZip бесплатен для использования.

3 голосов
/ 20 марта 2011

Это невозможно, потому что другие файлы в ZIP должны быть извлечены, прежде чем они могут быть использованы .exe.

...