Какой самый простой способ создать самораспаковывающийся установщик программы zip (SFX) для Windows, который будет использовать каталог Windows Temp? - PullRequest
4 голосов
/ 11 ноября 2011

У меня есть очень простая программа, которая состоит из .NET 2.0 exe ​​(Program.exe), который вызывает x32 Win32 .dll (Lib.dll).

Я хотел бы объединить их в один самораспаковывающийся zip-архив (SFX) под названием Tool.exe Tool.exe, который извлечет файлы (Program.exe и Lib.dll) в системный каталог Windows Temp, изатем вызовите Program.exe

Таким образом, я могу предложить загрузку отдельного файла .exe с именем Tool.exe, и, насколько это касается пользователя, он просто запускает Tool.exe, а не многофайловую программу.

WinRAR обладает возможностями SFX и возможностью автоматического запуска извлеченного EXE-файла, но, похоже, он не позволяет вам извлекать его в каталог временных файлов Windows (можно указать абсолютный путь, ноTemp dir изменяется в зависимости от того, какая версия Windows).Кроме того, при извлечении появляется всплывающее окно, и это излишне для моих целей - сделать так, будто пользователь просто запускает мою программу.

В качестве альтернативы, есть ли способ встроить собственный Lib.dll в мойскомпилированный исполняемый файл .NET, почти как «ресурс»?

Я бы действительно хотел избежать полной установки MSI или даже обычного установщика .exe, так как это очень трудно сделать, даже с более простыми установщиками, такими какNSIS.

Ответы [ 3 ]

9 голосов
/ 16 ноября 2011

Я склонен делать это только с 7-zip и UPX , следуя этим инструкциям, чтобы он запускал пакетный файл при выполнении / извлечении . Вот пример сценария CMD, который я использую для создания EXE-файла, включая файлы в каталоге. \ Bin:

pushd %~dp0
upx --ultra-brute 7zsd.sfx 
cd Bin
..\7za a -mx=9 "..\Program.7z" * 
cd ..
copy /b 7zsd.sfx + Config.txt + Program.7z Program_Name.exe
del Program.7z

Файл config.txt выглядит так:

;!@Install@!UTF-8!
GUIMode="0"
RunProgram="runme.cmd" 
;!@InstallEnd@!

Ваш пробег может меняться, конечно ...

1 голос
/ 11 ноября 2011

NSIS имеет полезную утилиту под названием Zip2Exe.По сути, вы даете ему zip-файл и указываете папку для извлечения (в вашем случае $TEMP), и она генерирует установщик.

Вы можете запустить такой установщик в режиме без вывода сообщений (чтобы пользователь нена самом деле смотрите установщик).Таким образом, вы можете установить и запустить программу Tool.exe.Установщик может быть встроенным ресурсом, который вы сначала записываете во временный файл перед запуском.Тогда пользователь никогда не узнает ни о каком инсталляторе.С их точки зрения, Tool.exe выполняет некоторую работу, дает некоторую обратную связь «пожалуйста, подождите ...», а затем запускается реальная программа, которую вы хотите запустить, и Tool.exe завершает работу.

Редактировать: ВОглядываясь назад, вы можете обнаружить, что проще просто извлечь и запустить Program.exe (и вашу dll) из Tool.exe, а затем выйти из Tool.exe.Еще лучше: пусть пользователь запустит Program.exe (который записывает lib.dll на диск перед загрузкой).

Надеюсь, это даст вам некоторые идеи.Имейте в виду, что у вас могут быть проблемы с UAC и антивирусными сканерами.

0 голосов
/ 11 ноября 2011

DotNetZip может производить SFX с каталогом извлечения по умолчанию. Когда вы создаете SFX, укажите% TEMP% в качестве места извлечения по умолчанию, а когда SFX фактически выполняется, переменная разрешается. DotNetZip может также запустить программу после распаковки SFX, и эта программа может быть одной из вещей, которые были извлечены.

Так что вы можете использовать DotNetZip, чтобы делать то, что вы хотите.

Альтернатива объяснена в этой статье . В нем показано, как динамически выполнять вызовы в собственные библиотеки Win32 из .NET. Используя эту технику, вы можете связать библиотеку как ресурс с вашим .NET EXE, а затем, когда запустите .NET EXE, извлечь библиотеку, а затем сделать динамические вызовы в нее.

...