Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2011, 16:30   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию Зависимость библиотеки от библиотеки

Допустим, у меня есть программа program.exe. Она сканирует папку plugins/ в поисках подходящих библиотек, находит plugin.dll, и пытается загрузить её.

plugin.dll, в свою очередь, зависит от библиотеки anotherlib.dll.

Я хочу, чтобы anotherlib.dll была в той же папке, что и сам плагин (plugins/), но программа работает только если она находится в папке с exe.

Можно сделать так, чтобы plugin.dll искал anotherlib.dll в своей папке, а не в папке запускаемой программы? Причём anotherlib.dll по-прежнему должен быть статически подключён к проекту plugin.dll.

program.exe и plugin.dll полностью в моей власти, anotherlib.dll - стороннего разработчика.

plugins.dll и anotherlib.dll я копирую в проект program.exe через Post-build event command line.

Последний раз редактировалось ds.Dante; 06.07.2011 в 17:05.
ds.Dante вне форума Ответить с цитированием
Старый 06.07.2011, 22:11   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Вот тут ответ имеется.
Spawn™Production® вне форума Ответить с цитированием
Старый 07.07.2011, 12:55   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Спасибо! Наконец-то нашёл ошибку. Приведённый ответ у меня не работает (что вообще-то странно), но я исправил ошибки.

Сделать так, чтобы anotherlib.dll искалась в той же папке, что и plugin.dll (где бы она ни была) не получилось, зато получилось искать все недостающие библиотеки в папке Plugins.

Для этого в proga.exe я добавил такие строки:
Код:
static Assembly LoadFromPluginsFolder (object sender, ResolveEventArgs e)
{
	string folderPath = Path.GetDirectoryName (Assembly.GetExecutingAssembly().Location) + "\\Plugins";

	string assemblyPath = e.Name;
	// Вычленяем имя файла из e.Name. В том примере следующих двух строк не было
	if (assemblyPath.IndexOf (',') != -1)
		assemblyPath = assemblyPath.Remove (assemblyPath.IndexOf (','));
	assemblyPath += ".dll";


	assemblyPath = Path.Combine (folderPath, assemblyPath);

	return Assembly.LoadFrom (assemblyPath);
}
В инициализации програмы добавляем строчку
Код:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler (LoadFromPluginsFolder);
и всё работает как надо.

Жаль только, что я не могу узнать папку плагина, вызвавшего ошибку. Добавлять обработку ошибок в plugin.dll бессмысленно, так как ошибка возникает до того, как выполняются его конструкторы (даже статические).
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотеки С/C++ stenl1 Visual C++ 7 03.01.2011 16:53
Библиотеки С и С++ alex_alpha Помощь студентам 4 14.06.2010 21:28
Библиотеки С++. Rudeboy Помощь студентам 3 02.06.2010 13:17
Библиотеки js Help_me JavaScript, Ajax 3 03.03.2009 14:07