Столкнулись с ситуацией. Есть система, расширяемая плугинами.
Происходит такая фигня — разработчик Вася, знающий тему, но слабо понимающий C# звонит разработчику Пете и просит у него пример плугина. Получает проект, реализует свою функциональность, проверяет и рапортует — "готово!".
Потом они оба присылают свои творения и оказывается, что Вася поменял только код, а реквизиты сборки — нет.
В результате у них могут совпадать:
1) Имя файла сборки.
2) AssemblyName
3) Имя класса, реализующего интерфейс.
Как все разом, так и по-отдельности. Ну п.1 решается на месте ручками, а п2. и п3 ?
Как с этим работать при том, что отослать-править-получить с Васи — это пара дней, а работать оно должно было еще вчера ?
Годятся любые средства — хоть утилиты, хоть Reflection, хоть Reflection.Emit.
В принципе — можно использовать не оба плугина сразу, а выбрать в настройках из них только 1, но с этим тоже проблемы — вторая сборка при одинаковом AssembyName не прочтется, даже список выбора не составить.
Re: Конфликт сборок с одинаковыми AssembyName и прочим
Если различия на самом деле так велики, то можно рефлектором с соотв-щим плугином получить полный исходник сборки и пересобрать так, как надо.
Если различий меньше (например, только в версии), то можно перенаправлять зависимости через app.config без перекомпиляции.
Re[2]: Конфликт сборок с одинаковыми AssembyName и прочим
I>Если различия на самом деле так велики, то можно рефлектором с соотв-щим плугином получить полный исходник сборки и пересобрать так, как надо.
Там ного кода — не факт, что получится.
I>Если различий меньше (например, только в версии), то можно перенаправлять зависимости через app.config без перекомпиляции.
Нет, сам код абсолютно различен. Вариант вида "оставить в директории 1 нужный плагин" — работает
Хочется хотя-бы иметь в директории плагинов 2 плагина с одинаковым AssemblyName и подгружать при работе нужный.
А перед этим показать пользователю, что их 2 — и пусть выбирает с каким именно работать.
Re: Конфликт сборок с одинаковыми AssembyName и прочим
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Столкнулись с ситуацией. Есть система, расширяемая плугинами.
N_P>Происходит такая фигня — разработчик Вася, знающий тему, но слабо понимающий C# звонит разработчику Пете и просит у него пример плугина. Получает проект, реализует свою функциональность, проверяет и рапортует — "готово!".
N_P>Потом они оба присылают свои творения и оказывается, что Вася поменял только код, а реквизиты сборки — нет.
N_P>В результате у них могут совпадать:
N_P>1) Имя файла сборки. N_P>2) AssemblyName N_P>3) Имя класса, реализующего интерфейс.
N_P>Как все разом, так и по-отдельности. Ну п.1 решается на месте ручками, а п2. и п3 ?
N_P>Как с этим работать при том, что отослать-править-получить с Васи — это пара дней, а работать оно должно было еще вчера ?
N_P>Годятся любые средства — хоть утилиты, хоть Reflection, хоть Reflection.Emit.
N_P>В принципе — можно использовать не оба плугина сразу, а выбрать в настройках из них только 1, но с этим тоже проблемы — вторая сборка при одинаковом AssembyName не прочтется, даже список выбора не составить.
А как происходит загрузка плагинов? Если годятся любые средства, то почему бы не загружать их в разные домены приложений? Или, как вариант, использовать Assembly.LoadFile для загрузки сборок. В обоих вариантах единственное, что нужно будет сделать, это положить сборки по разным путям.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Конфликт сборок с одинаковым всем - А вот кстати да!
N_P>В результате у них могут совпадать:
N_P>1) Имя файла сборки. N_P>2) AssemblyName N_P>3) Имя класса, реализующего интерфейс.
А вот кстати да, кто-нибудь знает, какие проблемы/нюансы в подобной ситуации, когда у нескольких dll совпадает все (AssemblyName, Version и Public Key Token)? И все эти DLL находятся в GAC'е (разница только в том, с каким фреймворком они сбилдены — 1.1 и 2.0). И как вообще ищется нужная/загружается нужная, в каком порядке?
Re[2]: Конфликт сборок с одинаковым всем - А вот кстати да!
Здравствуйте, campri, Вы писали:
N_P>>В результате у них могут совпадать:
N_P>>1) Имя файла сборки. N_P>>2) AssemblyName N_P>>3) Имя класса, реализующего интерфейс.
C>А вот кстати да, кто-нибудь знает, какие проблемы/нюансы в подобной ситуации, когда у нескольких dll совпадает все (AssemblyName, Version и Public Key Token)? И все эти DLL находятся в GAC'е (разница только в том, с каким фреймворком они сбилдены — 1.1 и 2.0). И как вообще ищется нужная/загружается нужная, в каком порядке?
А как установить в GAC несколько разных dll с одинаковым identity, но построенных для разных фреймворков?
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[3]: Конфликт сборок с одинаковым всем - А вот кстати да!
C>А как установить в GAC несколько разных dll с одинаковым identity, но построенных для разных фреймворков?
Ну это делает инсталятор, как я понимаю, используя gacutil.exe; для тестов можно просто Drag-Drop в C:\Windows\assembly
А физически они находятся в разных местах (вроде как \assembly\GAC\ vs \assembly\GAC_MSIL\)...
Re[3]: Конфликт сборок с одинаковыми AssembyName и прочим
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Там ного кода — не факт, что получится.
ildasm | change AssemblyName | ilasm
получится всегда, если Вася не использовал хитрых обфускаций.