Возможно ли это?Что ж, давайте посмотрим на ситуацию здесь.
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 бесплатен для использования.