как связать зависимости в exe

Часто у моих исполняемых файлов есть зависимости dll, которые я упаковываю с помощью установщика, такого как nsis или inno. Это имеет смысл для больших программ, но излишне для маленьких скриптов.

Есть ли альтернативный способ связывания зависимостей, чтобы пользователь мог просто выполнить один exe-файл и не требовать каталога dll в PATH?


ИЗМЕНИТЬ

Я надеюсь на решение, которое не будет зависеть от типа dll и будет работать и для других видов зависимостей.

Вот несколько возможных вариантов:

У кого-нибудь есть опыт работы с таким инструментом?


person hoju    schedule 29.04.2011    source источник
comment
Большинство опытных разработчиков советуют вам не использовать эти инструменты, а вместо этого устанавливать EXE и DLL в один и тот же каталог. Похоже, вы не хотите следовать этому совету. Поскольку вы решительно настроены использовать один из этих инструментов, почему бы вам просто не сделать это?   -  person David Heffernan    schedule 30.04.2011
comment
Раньше всегда так было, а сейчас раздаю много мелких скриптов и клиентам не нравится папка зависимостей.   -  person hoju    schedule 02.05.2011


Ответы (5)


Хорошо, вам не понравилась ни одна из двух моих других идей... так что начнем...

Вы отправляете и даете своим клиентам «заглушку EXE». EXE-заглушка не зависит ни от чего другого и просто содержит ZIP-файл (или пакет установки или аналогичный) в качестве ресурса в EXE-заглушке. ZIP-файл, встроенный в заглушку EXE, содержит только фактическую программу EXE и все ее зависимые библиотеки DLL. Когда заглушка EXE запускается, она просто распаковывает ZIP-файл в подкаталог TEMP и запускает EXE-файл приложения.

Вы можете оптимизировать его таким образом, чтобы, если приложение уже было установлено в %TEMP%, вы пропустили шаг распаковки и просто запустили уже существующий EXE-файл приложения.

Лично я бы не пошел по этому пути. Просто дайте пользователю установщик, если у EXE есть зависимости. Но вы знаете своих пользователей и клиентов лучше, чем я.

person selbie    schedule 30.04.2011
comment
Не проще ли было бы просто настроить однократное приложение для обработки всего этого? - person pjwilliams; 01.05.2011
comment
Можно было бы даже загрузить все необходимые файлы прямо из этого исполняемого файла-заглушки, однако это было бы сложнее реализовать, чем просто извлечь все необходимые файлы во временный каталог и запустить оттуда основное приложение. - person Alexey Ivanov; 02.05.2011
comment
Я согласен, поэтому я предложил в последней строке выше просто дать пользователю установщик.... - person selbie; 03.05.2011

Вы можете статически связать исполняемый файл.

person Delan Azabani    schedule 29.04.2011

Одним из вариантов является установка DLL в GAC.

person pjwilliams    schedule 29.04.2011

Вы не упомянули, что такое зависимости DLL. Просто прямые библиотеки DLL с заглушкой? Динамически загружается через LoadLibrary? COM? Требуется регистрация? Есть ли в этом .NET?

Несколько вариантов для рассмотрения.

  1. Поместите все необходимые библиотеки DLL в тот же каталог, что и EXE (чтобы вам не пришлось возиться с переменной PATH). Установка представляет собой просто «копию *.*» или просто разрешено запускать из общей папки. (YMMV, если есть код .NET, поскольку он имеет ограничение безопасности при запуске из удаленного общего файлового ресурса).

  2. Статически свяжите EXE-файл с C-Runtime вместо динамического параметра (чтобы вам не пришлось повторно распространять MSVCRT на машинах, на которых он еще не установлен).

У меня есть несколько более безумных идей, если двух вышеперечисленных пунктов недостаточно. Дай мне знать.

person selbie    schedule 29.04.2011
comment
Я хочу избежать каталога dll, который может пугать и сбивать с толку моих пользователей. - person hoju; 29.04.2011
comment
и статическая ссылка не вариант - person hoju; 29.04.2011

По-видимому, существует программное обеспечение, которое может конвертировать DLL в LIB, так что вы можете ссылаться на него статически, но в данном случае это может быть излишним.

person hammar    schedule 29.04.2011