Reflection (наверно)
От: Grammer  
Дата: 18.10.05 14:54
Оценка:
Есть приложение которое имеет поддержку pluginов
все плагины лежат в одной папке с исполняем файлом
как вы догадались в этой папке есть много не нужных библиотек
+ даже в нужных сборках помимо нужных типов содержиться можество не нужных

схема следующая
сначала грузиться сборка:

Assembly.LoadFile(...)



затем

Type[] types = dll.GetExportedTypes();


и в foreach смотряться все типы и ищется тот который унаследован от определенного базового класса береться его статический метод и формируется некоя информацию доступная пользователю который уже решает надо экземпляр этого класса ему или нет по полученным данным

что плохо:
Грузяться все без исключения библиотеки (я конечно понимаю что если они уже были загружены то они еще раз не грузяться но те которым еще рано загружаться уже в пути) а выгрузить ненужные уже не получиться (не считаю создания отдельного домена и тд но это лишние временные затраты)
Если в сборке не окзалось ни одного нужного мне типа то она мне фактически не нужна (в данный момент, так как если она лежит в папке она понадобиться)

можно ли как нить исследовать сборку загружая как бы не всю её а лишь данные о типах...
и после исследованиярешать надо ли её грузить или нет

спасибо
Re: Reflection (наверно)
От: TK Лес кывт.рф
Дата: 18.10.05 15:02
Оценка: 9 (1)
Здравствуйте, Grammer, Вы писали:

G>можно ли как нить исследовать сборку загружая как бы не всю её а лишь данные о типах...

G>и после исследованиярешать надо ли её грузить или нет

Есть библиотеки с функциональностью аналогичной reflection но, не требующие загрузки сборки. Например, одна из них есть в FxCop
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Reflection (наверно)
От: stasukas  
Дата: 18.10.05 15:40
Оценка:
Здравствуйте, Grammer, Вы писали:

G>Есть приложение которое имеет поддержку pluginов

G>все плагины лежат в одной папке с исполняем файлом
G>как вы догадались в этой папке есть много не нужных библиотек
G>+ даже в нужных сборках помимо нужных типов содержиться можество не нужных
[Skipped]

G>что плохо:

G>Грузяться все без исключения библиотеки ...
Для этого создаются конфигурационные файлы, в которых отмечаешь, что хочешь загрузить.

Если отталкиваешься от библиотек, то перечисляешь библиотеки на загрузку. Если отталкиваешься от классов, то классы.

Если необходимо динамически при каждой загрузке программы подгружать новые библиотеки/классы, то перечисляешь новые и спрашиваешь у пользователя, грузить их в дальнейшем или нет. После этого сохраняешь в конфигурационном файле список полностью, чтоб знать, какие новые библиотеки появились.

[Skipped]
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Now playing: Loudeast — Sondio Profundo
Reflection (наверно)
От: Аноним  
Дата: 18.10.05 15:34
Оценка: +1
А зачем такие мучения?
Положите их в отдельную директорию
или назовите по особому, например, добавив расширение .plugin
или заведите конфиг файл, в котором будут имена плагинов...
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Reflection (наверно)
От: Codechanger Россия  
Дата: 18.10.05 17:38
Оценка:
Здравствуйте, stasukas, Вы писали:

S>Здравствуйте, Grammer, Вы писали:


G>>Есть приложение которое имеет поддержку pluginов

G>>все плагины лежат в одной папке с исполняем файлом
G>>как вы догадались в этой папке есть много не нужных библиотек
G>>+ даже в нужных сборках помимо нужных типов содержиться можество не нужных
S>[Skipped]

G>>что плохо:

G>>Грузяться все без исключения библиотеки ...
S>Для этого создаются конфигурационные файлы, в которых отмечаешь, что хочешь загрузить.

S>Если отталкиваешься от библиотек, то перечисляешь библиотеки на загрузку. Если отталкиваешься от классов, то классы.


S>Если необходимо динамически при каждой загрузке программы подгружать новые библиотеки/классы, то перечисляешь новые и спрашиваешь у пользователя, грузить их в дальнейшем или нет. После этого сохраняешь в конфигурационном файле список полностью, чтоб знать, какие новые библиотеки появились.


S>[Skipped]

Я когда-то писал так:
public void InitializePlugins()
{
Libs=new ArrayList();
Directory.SetCurrentDirectory(Dir+"Plugins\\");//Получаем все файлы в директории с определенным расширением
string[]Files=Directory.GetFiles(Dir+"Plugins\\","*.dll");
ObjectHandle obj=null;
foreach (string Name in Files)
{
try
{
obj=Activator.CreateInstanceFrom(Name,"Razbor.Parser");//Тут создаем инстанс нужный
}
catch(System.Exception e)
{
string t=e.Message;
obj=null;
}
finally
{

}
if(obj is IPlugin) //тут проверяем наличие у инстанца нужного интерфейса
{

IPlugin Plugin=(IPlugin) obj.Unwrap();//Тут развертываем инстанс в нужный тип объекта
Libs.Add(Plugin);//Кладем в ArrayList для дальнейшего использования
}

}
}
Можно и по-другому. У меня довольно громоздко
Re: Reflection (наверно)
От: PeterZT  
Дата: 18.10.05 18:42
Оценка:
Вариантов 2
1. Грузи в отдельный домен для инспекции, потом прибивай домен, и загружай по нормальному
2. Для 2.0: можно указать при загрузке что нужно только для инспекции ( только потом все равно лучше прибить домен ИМХО)
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: Reflection (наверно)
От: Grammer  
Дата: 19.10.05 13:36
Оценка:
Здравствуйте, erigami, Вы писали:

E>А зачем такие мучения?

E>Положите их в отдельную директорию
E>или назовите по особому, например, добавив расширение .plugin
E>или заведите конфиг файл, в котором будут имена плагинов...

положить отдельно идея классная но сборки используют еще допольнительные dll которые использует и основное приложение которое грузит сборки аобзывать их особенно конечно можно, но как то это не красиво, хотя насчет последнего может я и не прав.
Re: Reflection (наверно)
От: Аноним  
Дата: 19.10.05 15:08
Оценка:
положить отдельно идея классная но сборки используют еще допольнительные dll которые использует и основное приложение

AppDomain.AssemblyResolve event вас спасет
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Reflection (наверно)
От: Аноним  
Дата: 19.10.05 15:14
Оценка:
Только вот еще замечание по поводу того, что все dll в одной куче.
Если это плагины, то они поставляются авторами в бинарном виде.
Далее — предположим, некто создал плагин, скомпилил и отдал его.
Потом разработчик приложения изменил одну из общих сборок —
в результате плагин работать перестал.
Если вы ответите, что все плагины ваши и поставляются в исходниках и компилятся вместе, то непонятно, зачем вообще возня с этими dll...
shura


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Reflection (наверно)
От: Grammer  
Дата: 20.10.05 06:19
Оценка:
Здравствуйте, erigami, Вы писали:

E>Только вот еще замечание по поводу того, что все dll в одной куче.

E>Если это плагины, то они поставляются авторами в бинарном виде.
E>Далее — предположим, некто создал плагин, скомпилил и отдал его.
E>Потом разработчик приложения изменил одну из общих сборок —
E>в результате плагин работать перестал.
E>Если вы ответите, что все плагины ваши и поставляются в исходниках и компилятся вместе, то непонятно, зачем вообще возня с этими dll...

ну предположим что не плашиновые dll поставляются разработчикам в бинарном виде и они их менять соответственно не могут, только писать на их основе свои плагины
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.