Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема при динамической загрузке библиотеки  (Прочитано 4527 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 10-06-2010 13:30 » 

1) есть одна длл CurrentClient_V1, которая включает в себя как reference другую длл - UserDll.dll (код в проект не подключен).

Код:
Код:
namespace CurrentClient
{
public class A_StoreTest
{

static public void test_Client_test1()
{
Console.WriteLine("A_StoreTest::test_Client_test1()");

UserDll.UserCls.testFunc_1();
}

static public void test_Client_test2()
{
Console.WriteLine("A_StoreTest::test_Client_test2() ");

UserDll.UserCls objTest = new UserCls();
objTest.testFunc();
}


}
}

2) есть третья длл,  которая загружает нашу CurrentClient_V1 динамически.
Затем я нахожу в загруженной длл-ли свой класс, в нем - нужную функцию и пытаюсь ее вызвать.

Код:

Assembly curDll = Assembly.LoadFile(assemblyName);
foreach (Type type in curDll.GetTypes())
{
      if (type.Name == m_sTestClass)
      {
testType = type;
break;
      }
} // foreach (Type type in curDll.GetTypes())


         System.Reflection.MethodInfo[] methods = testType.GetMethods();

for (int i = 0; i < methods.Length; i++)
{
System.Reflection.MethodInfo curMethod = methods[i];
object[] myparam = null;
curMethod.Invoke(null, myparam);
}

Ошибка:

Код:
System.IO.FileNotFoundException : Could not load file or assembly 'UserDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

Посмотрела в окошке "modules" в студии - действительно нет...
А вот почему?  А черт его знает...
« Последнее редактирование: 10-06-2010 14:12 от Malaja » Записан

холоднокровней, Маня, Ви не на работе
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #1 : 10-06-2010 15:39 » 

тут подвесила тестовые проекты:
а) UserDll.dll м. находиться где угодно. Важно - после компиляции dll и pdb д.б. скопированы в папку "ClientsWithDiffVers_OneSvr_exe\CurrentClient\UserDll_V1" (таково условие - у нас в руках только бинарники)
б) ClientsWithDiffVers_OneSvr_exe.rar - набор всех остальных библиотек:
 - в "CurrentClient" находится CurrentClient_V1
 - в "CurrentClient\out\V1" находится CurrentClient_V1.dll
 - в  "TestInterface" я создала интерфейс для теста -  подумала, что это может как-то спасти ситуацию (там идет дополнительная инициализация)

* dll_test.rar (15.05 Кб - загружено 130 раз.)
Записан

холоднокровней, Маня, Ви не на работе
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 10-06-2010 16:44 » 

Цитата: Malaja
UserDll.dll м. находиться где угодно.
Это условие, которое тебе надо реализовать, или условие, которое уже реализовано?

В первом случае её надо поместить в GAC.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 11-06-2010 08:53 » 

Дим,
1) бииблиотека должна UserDll.dll (а в реальности это целая куча длл-лей) находиться в какой-то определенной папке (наш админ уже сказал, где мы должны разместить бинарники, исходя из общей структуры расположения кода на диске)
2) почему ее надо помещать в GAC? Она ведь скомпилирована вместе с CurrentClient_V1.dll, т.е.  при загрузке CurrentClient_V1.dll наша UserDll.dll должна быть тоже загружена в пространство процесса...
3) немного почитала про внесение длл-ли в GAC. Первое впечатление - сплошные танцы с бубнами...
Но в реальности это идет по принципу ригистрации длл-ли (в 6-ой студии это делалось через regsvr32). Или я опять мимо...?
Записан

холоднокровней, Маня, Ви не на работе
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 11-06-2010 09:47 » 

Цитата: Malaja
2) почему ее надо помещать в GAC?
Ну как у тебя написано, так я и понял. DLL может размещаться где угодно. Чтобы приложение её смогло найти, приложение должно размещаться либо в той же папке, либо DLL должна быть доступна из любого места - в этом случае она включается в GAC.

Цитата: Malaja
Но в реальности это идет по принципу ригистрации длл-ли (в 6-ой студии это делалось через regsvr32). Или я опять мимо...?
Да, чем-то это похоже на регистрацию COM.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 11-06-2010 13:59 » 

Дим,
я, судя по всему, что-то не так объяснила - изначально приношу свои извинения.
UserDll.dll находится в конкретной папке, из которой она и прилинковывается к CurrentClient_V1. При компиляции CurrentClient_V1 наша пользовательская UserDll.dll копируется в ту же папку, куда помещается готовая CurrentClient_V1.dll 

Записан

холоднокровней, Маня, Ви не на работе
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 11-06-2010 14:36 » 

Malaja, я термин "прилинковывается" применительно к DLL не понимаю. В общем, у тебя установлен reference на UserDll.dll, и в процессе сборки эта dll копируется в папку bin со всеми прочими частями приложения.

Тогда GAC не нужен.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 11-06-2010 14:52 » 

Дим,
мне тоже так кажется, что он не нужен.
Но почему моя UserDll.dll не загружается при выполнении программы, я так и не пойму...
Записан

холоднокровней, Маня, Ви не на работе
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 11-06-2010 15:27 » 

Причину нашла (сподобилась посмотреть таки, где наша длл-лина ищется... я почему-то была уверена в том, что она ищется в той же папке, в которой лежит загружаемая нами CurrentClient_V1.dll...), но с логикой не разобралась...

1) наша UserDll.dll при компиляции CurrentClient_V1-проекта попадает в ту же папку, куда и результирующая CurrentClient_V1.dll.

2) при динамической загрузке наше приложение делает следующее:
-  CurrentClient_V1.dll берет по указанному нами адресу
- а вот UserDll.dll принципиально ищет у себя в bin\Debug... А там, естественно, ее нет, т.к. она тут неизвестна...

И почему это так, не знаю...  Я зол! Жаль
Записан

холоднокровней, Маня, Ви не на работе
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines