Распределение DLL внутри EXE (C ++) - PullRequest
2 голосов
/ 22 октября 2010

Как я могу включить библиотеки зависимостей моих программ в файл EXE (поэтому мне нужно только распространить этот один файл)? Я использую C ++, поэтому я не могу использовать ILMerge, как обычно для C #, но есть ли более простой способ автоматически сделать это в Visual Studio?

Я знаю, что это возможно (вот почему работают установщики), мне просто нужна помощь, чтобы указать лучший способ для этого.

Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Есть много проблем с этим подходом.Например, см. этот пост от REAL Software.Их «REALbasic» продукт, используемый для этого, имел проблемы, в том числе:

  • При записи DLL во время выполнения он вызывал бы антивирусные предупреждения.где у пользователя нет прав на запись или мало места на диске.

Попытка решить проблему вызвала больше проблем, включая сбои.В конце концов они уступили и теперь распространяют библиотеки DLL вместе с приложениями.

Если вам действительно требуется развертывание с одним EXE-файлом, и по какой-то причине вы не можете использовать установщик,Способ заключается в статической привязке всех зависимостей.Это предполагает, что у вас есть правильные .lib с (а не только .lib с этой ссылкой в ​​DLL).

1 голос
/ 22 октября 2010

Существует два варианта, оба из которых далеки от идеальных:

  1. записать временный файл куда-нибудь
  2. загрузить DLL в память «вручную», т.е. создать памятьзаблокировать, поместить образ DLL в память, затем обработать перемещения и внешние ссылки.

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

Еще одна опция, используемая в некоторых сценариях: создайте виртуальный диск, содержимое которого хранится в ваших файловых ресурсах EXE, и загрузите оттуда DLL.Это возможно при использовании нашего продукта SolFS (версия для ОС), но для создания самого виртуального диска необходимо использовать драйверы режима ядра, которые должны быть записаны на диск перед использованием.

1 голос
/ 22 октября 2010

Большинство установщиков используют zip-файл (или что-то подобное) для хранения любых необходимых файлов.Когда вы запускаете установщик, он распаковывает данные и, при необходимости, помещает отдельные файлы (и обычно добавляет записи реестра, регистрирует все установленные элементы управления COM и т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...