PDA

Просмотр полной версии : [Руководство] Добавляем необходимые .dll в программу без помощи пакеров


Nickitee
06.09.2012, 22:41
Всем привет, я думаю всем кто кодит хоть какое-то время на C# приходилось добавлять в свой проект .dll для работы необходимых компонентов, и когда мы пускаем программу в общее пользование, вместе с .exe должны быть .dll которые использовались при компиляции - это не всегда удобно. Много писать не буду, ибо нету смысла, опишу только важное.

Итак...
Для начала добавим наши .dll в ресурсы, для этого переходим по следующему пути в MVS:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Добавляем свои .dll.


Теперь там где у вас инициализирующая точка

//Например
[STAThread]
static void Main()
{
//...
}

Копируем следующий код:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
byte[] h = null; //Создаём пустой массив байтов
var resName = args.Name.Split(',')[0]; //Выдираем название недостающей .dll
if (resName == "VAMemory") //Если для этого названия есть своя .dll то делаем следующее
{
h = Properties.Resources.VAMemory; //Загружаем в массив байтов .dll
}
return h != null //Если массив байтов не равен нуль
? Assembly.Load(h) //Загружаем
: null; //Ничего не делаем
};

Обычно имя недостающей .dll это имя оригинальной .dll, если не получается, то ставим бряк после var resName и смотрим название.

Конец
Итак, теперь при инициализации программы будет создаваться не пустой эвент AssemblyResolve. Когда программе будет не хватать функции из .dll а собственно и самой .dll исполнится эвент AssemblyResolve в котром мы предоставим необходимую .dll и загрузим её для дальнейшей работы.
Теперь для полноценной работы вашей программы необходим только .net framework и естественно сама программа.


Мини-гайд был написан для zhyk.ru by Nickitee

-Emp-
24.11.2012, 03:41
Nickitee, Большое спасибо! Очень полезная вещь. Более того, у тебя код компактней, чем другие варианты в интернете.

Тут опечатка:

else if (resName == "VAMemory") //Если для этого названия есть своя .dll то делаем следующее

лишний else, ну все равно каждый у себя, я думаю, это исправит.

//programm
13.08.2013, 09:47
using System.Reflection;

Lazizbek
09.09.2014, 12:30
А если DLL два что тогда делать?

Sinyss
09.09.2014, 15:39
А если DLL два что тогда делать?
/kidding ровно тоже самое... /kidding

Lazizbek
13.09.2014, 00:57
что то не получается, как я понимаю эвент подписывается только на одну,
Не могли бы показать пример?

Nickitee
13.09.2014, 14:28
что то не получается, как я понимаю эвент подписывается только на одну,
Не могли бы показать пример?

var resName = args.Name.Split(',')[0]; //Выдираем название недостающей .dll

теперь в resName имя необходимой .dll, сверяй и юзай.