Распаковка на лету на C #

Я создал консольное приложение, которое работает нормально, когда ссылается на файл .exe из Program Files, но у моих пользователей может не быть этого .exe в их каталоге Program Files.

Я бы предпочел сохранить пакет как один .exe для простоты, поэтому мне было интересно, как я могу объединить два .exe в один пакет.

Одна вещь, о которой я подумал, - это заархивировать .exe из каталога Program Files во временное место, и я буду хранить двоичные данные для zip-архива в исходном коде своих консольных приложений. Это лучший способ сделать это или есть методы получше?

Примечание. У меня нет исходного кода .exe, на который я хочу ссылаться в своем консольном приложении.


person Kratz    schedule 16.08.2010    source источник


Ответы (3)


Вы, конечно, можете хранить дополнительные файлы в вашем .exe (или .dll) как встроенные ресурсы. Просто измените «действие сборки» для элемента в проекте на «Встроенный ресурс». Вы можете получить содержимое файла (которое при желании можно было бы сжать), используя следующее: System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("stream name")

Вы можете извлечь файл на диск, чтобы иметь возможность ссылаться на него, или вы можете загрузить его напрямую с помощью одного из вариантов Assembly.Load (), чтобы вам не нужно было когда-либо хранить его на диске.

Обратите внимание, что если вы решите распаковать его и сохранить на диске, вам потребуются права администратора в операционных системах Vista и Windows 7 (и правильно администрируемой XP), чтобы сохранить файл (ы) в каталог Program Files.

person Mark    schedule 16.08.2010
comment
Это именно то, что я хочу, спасибо. Требуются ли права администратора для распаковки в такое место, как C:\tmp? Хотя на самом деле это не проблема. Спасибо. :) - person Kratz; 17.08.2010
comment
Возможно, в зависимости от того, как настроена безопасность. Самый безопасный вариант - использовать System.IO.Path.GetTempPath() для поиска локального временного каталога. - person Mark; 17.08.2010

Вы можете использовать GZipStream для сжатия и распаковки файлы на C #. Для более сложного сжатия можно использовать другие библиотеки Zip, например SharpZipLib.

person Yuriy Faktorovich    schedule 16.08.2010
comment
Ага. У меня нет проблем со сжатием / распаковкой, просто интересно, как лучше всего сохранить двоичные данные архива в моем исходном коде, и возможно ли это вообще. Например, у меня была бы строка с именем programSource, из которой я бы сделал файл, а затем я смогу запустить типичные методы распаковки в этом архиве, чтобы получить из него файлы, которые я хочу. Спасибо. - person Kratz; 16.08.2010

Взгляните на эту ссылку: Встраивание сборок в другую сборку

По сути, ILMerge сделает то, о чем вы просите.

person Russ    schedule 16.08.2010