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

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

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

« : 07-06-2011 19:39 » 

Чисто эмпирически и native DLL, и .NET assembly DLL не загружаются автоматически, пока нет обращений.

Для native DLL требуется, чтобы в программе были обращения к импортируемым данным и функциям, иначе загрузка не происходит. Однако если обращения есть, то загрузка DLL по умолчанию происходит вместе с загрузкой вызывающего модуля.

Для .NET assembly DLL тоже нужны обращения. Но загрузка происходит в отложенном режиме - только при первом обращении.


Вопрос:

Можно ли как-нибудь настроить саму DLL таким образом, чтобы она загружалась вместе с загрузкой вызывающего модуля вне зависимости от обращений к ней? (Связано с тем, что при загрузке DLL выполняется тяжёлая инициализация, которая, во-первых, должна выполняться вне зависимости от использования функций DLL, во-вторых, плохо, если она выполняется в отложенном режиме - вызывает подвисание вызывающей программы.

Интересуют варианты как для native DLL, так и для .NET assembly DLL. Варианты изменения вызывающих модулей не предлагать.
Записан

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

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

WWW
« Ответ #1 : 07-06-2011 19:50 » 

Дим, а если принудительно загрузить библиотеку через LoadLibrary?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

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

« Ответ #2 : 08-06-2011 08:07 » 

quick and dirty:
просто тупо встроить dummy функцию и вызывать её всегда.

Хотя, наверное, вызов относится к запрещённому варианту "изменения вызывающего модуля", или?. Если чисто саму dll... Её загрузка и управление осуществляется средствами винды, т.к. dll может использоваться другими приложениями тоже, т.е. скорей всего придётся менять винду Ага . Например повесить хук, который бы загружал dll при старте вызывающего модуля.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

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

« Ответ #3 : 08-06-2011 09:57 » new

RXL, Джон, да, всякие dummy функции и LoadLibrary подразумевают "изменение вызывающего модуля". Я эти модули не контролирую - это разные приложения, большинство из которых я в глаза не видел, и написанные чёрте знает кем (во всех коннотациях этого выражения).

Цитата: Джон
скорей всего придётся менять винду
Ты пессимист. При обычной сборке DLL с использованием dllexport вместе с DLL формируется lib. Этот lib собирается вместе с "вызывающим модулем". Если этот lib прилинкован, DLL загружается автоматически при старте "вызывающего модуля".

В принципе, никто не мешает такой lib реализовать вручную, написав в нём LoadLibrary и всё прочее.

Но это потребует как минимум пересборки "вызывающих модулей", и ко всему прочему некоторые из них могут вообще грузить DLL при помощи LoadLibrary. Поэтому решение через lib годится только для новых или пересобираемых "вызывающих модулей" (без их изменения на уровне их исходного кода).

А вот с .NET assembly вообще беда. В частности, если собрать DLL, написанную на C++.NET, одновременно являющуюся обычной DLL и assembly, то при подключении этой DLL как assembly к другой assembly DllMain вообще не стартует, поскольку assembly загружаются при помощи своего особого механизма. И что с этим делять, я пока не знаю. Аналога lib-файла в .NET нет. Вернее, есть загадочные module в противовес assembly, но я нигде никогда не видел их применения на практике, допустим, в C#.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines