Показать полную графическую версию : Упаковка используемых dll в exe
Flammable
05-03-2010, 14:49
Пишу утилитку, использующую функции AutoItX3.dll и Interop.AutoItX3Lib.dll. Т.к AutoItX3.dll есть х64 и х86, то чтобы не путаться самому и не путать пользователя, необходимо эти dll упаковать в exe, а при необходимости загружать в память (без выгрузки на диск).
Пытался добавить эти библиотеки в проект с флагом Build Action = Embedded Resource, в результате размер exe-шника вырос в соответствии с размерами библиотек, но когда дело доходит до вызова функций AutoItX3, вылетает ошибка System.IO.FileNotFoundException. Interop.AutoItX3Lib.dll используется как референс.
Собственно вопрос - как упаковать эти библиотеки, чтобы оно работало?
Flammable
08-03-2010, 13:20
Что, никто не знает? :)
Flammable, к сожалению, никто...
У меня возникло несколько вопросов:
1) так ли необходимо таскать обе библиотеки в экзешнике? а если попробовать их сопуствующими файлами загружать динамически (в зависимости от ситуации), а ещё лучше указать в манифесте, какую библиотеку должен замапировать в адресное пространство загрузчик
2) я так понимаю что вы используете статическое линкование (с тонкостями с# не знаком), а вызывать их пробуете динамически
Flammable
08-03-2010, 22:33
ак ли необходимо таскать обе библиотеки в экзешнике? а если попробовать их сопуствующими файлами загружать динамически (в зависимости от ситуации), а ещё лучше указать в манифесте, какую библиотеку должен замапировать в адресное пространство загрузчик »
Неудобно. Библиотека AutoItX3 распространяется в двух версиях - х64 и х86. Они невзаивозаменяемы. Чтобы уменьшить количество файлов в сборке (оставить только .exe и .cfg), нужно упаковать две библиотеки внутрь.
По этой же причине я компилирую солюшн без манифеста.
2. Я добавляю референс AutoItX3Lib (Interop.AutoItX3Lib.dll) и вызываю его методы.
DillerInc
09-03-2010, 01:41
Flammable, я бы делал так: распаковывал нужную либу из ресурсов во временную директорию, далее подгружал её с помощью LoadLibrary, находил адрес нужной функции через GetProcAddress и далее работал бы с этим делом.Это на мой взгляд наиболее человечный вариант, если вы хотите, чтобы либы находились в ресурсах.Как это всё будет выглядеть в ДоДиезе, я понятия не имею.
а при необходимости загружать в память (без выгрузки на диск) »
...такое возможно,но это сложнее в виду того,что вам придётся самому настраивать релоки в либе.Этот способ описан Ms-Rem'ом в его статье про внедрение своего кода в чужой процесс - ТУТ (http://www.wasm.ru/article.php?article=apihook_2) - вам это совершенно ни к чему.
что-то туплю я... экзешник полностью в память загружается/маппируется или нет?
а если собрать 2 версии (32 и 64) со статической линковкой и инсталлятором? код то 64 и 32 всё равно различается
Flammable
12-08-2010, 19:16
Сам разобрался. Если кому интересно - ищите утилиту IL Merge.
Flammable, А ссылку скинуть влом?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.