Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Упаковка используемых dll в exe (http://forum.oszone.net/showthread.php?t=169242)

Flammable 05-03-2010 14:49 1361775

Упаковка используемых dll в exe
 
Пишу утилитку, использующую функции 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 1363541

Что, никто не знает? :)

pva 08-03-2010 22:05 1363863

Flammable, к сожалению, никто...
У меня возникло несколько вопросов:
1) так ли необходимо таскать обе библиотеки в экзешнике? а если попробовать их сопуствующими файлами загружать динамически (в зависимости от ситуации), а ещё лучше указать в манифесте, какую библиотеку должен замапировать в адресное пространство загрузчик
2) я так понимаю что вы используете статическое линкование (с тонкостями с# не знаком), а вызывать их пробуете динамически

Flammable 08-03-2010 22:33 1363876

Цитата:

Цитата pva
ак ли необходимо таскать обе библиотеки в экзешнике? а если попробовать их сопуствующими файлами загружать динамически (в зависимости от ситуации), а ещё лучше указать в манифесте, какую библиотеку должен замапировать в адресное пространство загрузчик »

Неудобно. Библиотека AutoItX3 распространяется в двух версиях - х64 и х86. Они невзаивозаменяемы. Чтобы уменьшить количество файлов в сборке (оставить только .exe и .cfg), нужно упаковать две библиотеки внутрь.
По этой же причине я компилирую солюшн без манифеста.

2. Я добавляю референс AutoItX3Lib (Interop.AutoItX3Lib.dll) и вызываю его методы.

DillerInc 09-03-2010 01:41 1363962

Flammable, я бы делал так: распаковывал нужную либу из ресурсов во временную директорию, далее подгружал её с помощью LoadLibrary, находил адрес нужной функции через GetProcAddress и далее работал бы с этим делом.Это на мой взгляд наиболее человечный вариант, если вы хотите, чтобы либы находились в ресурсах.Как это всё будет выглядеть в ДоДиезе, я понятия не имею.
Цитата:

Цитата Flammable
а при необходимости загружать в память (без выгрузки на диск) »

...такое возможно,но это сложнее в виду того,что вам придётся самому настраивать релоки в либе.Этот способ описан Ms-Rem'ом в его статье про внедрение своего кода в чужой процесс - ТУТ - вам это совершенно ни к чему.

pva 09-03-2010 08:07 1364035

что-то туплю я... экзешник полностью в память загружается/маппируется или нет?
а если собрать 2 версии (32 и 64) со статической линковкой и инсталлятором? код то 64 и 32 всё равно различается

Flammable 12-08-2010 19:16 1472375

Сам разобрался. Если кому интересно - ищите утилиту IL Merge.

Drongo 12-08-2010 20:35 1472433

Flammable, А ссылку скинуть влом?


Время: 13:47.

Время: 13:47.
© OSzone.net 2001-