11.11.2008, 08:50 | #1 |
Участник
|
CRM4, плагины и сборки.
Доброе время суток.
Занимаюсь CRM недавно, в основном пишу плагины. Когда сборка с плагинами самодостаточна все более или менее понятно. Но рано или поздно возникает необходимость вынести какие-то базовые вещи в отдельную сборку (назовем ее базовой), на которую уже добавляется референс из других сборок с плагинами. И тут возникает неприятный момент - поскольку, как я сказал, занимаюсь CRM недавно, базовая сборка также постоянно меняется и дополняется. Соответственно, при обновлении плагина на сервере, базовую сборку также нужно переписывать на сервер и перегистрировать ее в GAC. Но неприятность не в этом, а в том, что каждый раз нужно reset'ить IIS, иначе dll-ку с базовой сборкой не заменить. Я попробовал отказатьяс от GAC и грузить сборку в плагине через AssemblyResolve по фиксированному пути, но это, естественно, не помогло - dll-ка также блокируется. Потом я попробовал грузить файл в byte[] и оттуда уже грузить сборку. Теперь dll-ка не блокируется - ее даже можно удалить и все работает до перезапуска IIS, но в этом-то и проблема. Сервер не грузит новую версию поскольку у него уже в памяти есть старая и единственный выход - опять рестартить IIS. Смысл извращений теряется. Я в курсе что выгрузить отдельную dll вроде как нельзя - нужно выгружать весь AppDomen, в который она загружена. Но при обновлении плагина через тот же Plugin Registration Tool как то это происходит (возможно там и выгружается AppDomen - но почему тогда при этом не выгружается базовая сборка, которая по идее должна быть в том же домене что и сборка с плагинами?) В общем просьба поделиться опытом - может кто-то справился с подобным. PS. Знаю про ILMerge - но пользоваться ей не хочу. В сборке с плагинами создавать новый AppDomen и туда динамически грузить базовую тоже не хочу, поскольку это чревато неоправданным усложнением - хочется просто добавить референс и наследоваться скажем от базовых классов. PPS. Плохо что в C# нет чего-то типа статически линкуемой библиотеки. Или я просто не знаю как это сделать?
__________________
"Hello World!" 17 errors, 31 warnings |
|
11.11.2008, 10:04 | #2 |
Moderator
|
Насколько мне известно, проблему обойти невозможно (малой кровью, по крайней мере). Если "базовая сборка" не содержит базовых (родительских) типов, а только хелперы или утилиты, то ее можно загружать по рефлексии и тогда обновление должно происходить без проблем. Для отладки такой метод вполне подходит, но перед развертыванием сборку все равно придется переделывать, что снова породит отладку.
Я думаю проще завести тестовый сервер и безнаказанно его перезагружать так часто, как это требуется.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
11.11.2008, 10:42 | #3 |
Участник
|
Да так собственно и сделано, но все равно это напрягает. Кроме того, готовые плагины переодически заливаются на рабочий. Его дергать лишний раз вообще не хочется
__________________
"Hello World!" 17 errors, 31 warnings |
|
Теги |
assembly, crm, plugin, crm4 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|