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
Итак...
Для начала добавим наши .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