Конфликт сборок с одинаковыми AssembyName и прочим
От: Nikolay_P_I  
Дата: 14.01.09 07:15
Оценка:
Столкнулись с ситуацией. Есть система, расширяемая плугинами.

Происходит такая фигня — разработчик Вася, знающий тему, но слабо понимающий C# звонит разработчику Пете и просит у него пример плугина. Получает проект, реализует свою функциональность, проверяет и рапортует — "готово!".

Потом они оба присылают свои творения и оказывается, что Вася поменял только код, а реквизиты сборки — нет.

В результате у них могут совпадать:

1) Имя файла сборки.
2) AssemblyName
3) Имя класса, реализующего интерфейс.

Как все разом, так и по-отдельности. Ну п.1 решается на месте ручками, а п2. и п3 ?

Как с этим работать при том, что отослать-править-получить с Васи — это пара дней, а работать оно должно было еще вчера ?

Годятся любые средства — хоть утилиты, хоть Reflection, хоть Reflection.Emit.

В принципе — можно использовать не оба плугина сразу, а выбрать в настройках из них только 1, но с этим тоже проблемы — вторая сборка при одинаковом AssembyName не прочтется, даже список выбора не составить.
Re: Конфликт сборок с одинаковыми AssembyName и прочим
От: iliks Россия http://iliks.livejournal.com
Дата: 14.01.09 07:49
Оценка:
Если различия на самом деле так велики, то можно рефлектором с соотв-щим плугином получить полный исходник сборки и пересобрать так, как надо.
Если различий меньше (например, только в версии), то можно перенаправлять зависимости через app.config без перекомпиляции.
Re[2]: Конфликт сборок с одинаковыми AssembyName и прочим
От: Nikolay_P_I  
Дата: 14.01.09 08:24
Оценка:
I>Если различия на самом деле так велики, то можно рефлектором с соотв-щим плугином получить полный исходник сборки и пересобрать так, как надо.

Там ного кода — не факт, что получится.

I>Если различий меньше (например, только в версии), то можно перенаправлять зависимости через app.config без перекомпиляции.


Нет, сам код абсолютно различен. Вариант вида "оставить в директории 1 нужный плагин" — работает

Хочется хотя-бы иметь в директории плагинов 2 плагина с одинаковым AssemblyName и подгружать при работе нужный.
А перед этим показать пользователю, что их 2 — и пусть выбирает с каким именно работать.
Re: Конфликт сборок с одинаковыми AssembyName и прочим
От: crable США  
Дата: 14.01.09 08:56
Оценка:
Здравствуйте, 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: Конфликт сборок с одинаковым всем - А вот кстати да!
От: campri  
Дата: 14.01.09 10:33
Оценка:
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]: Конфликт сборок с одинаковым всем - А вот кстати да!
От: crable США  
Дата: 14.01.09 11:09
Оценка:
Здравствуйте, 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]: Конфликт сборок с одинаковым всем - А вот кстати да!
От: campri  
Дата: 14.01.09 12:20
Оценка:
C>А как установить в GAC несколько разных dll с одинаковым identity, но построенных для разных фреймворков?

Ну это делает инсталятор, как я понимаю, используя gacutil.exe; для тестов можно просто Drag-Drop в C:\Windows\assembly
А физически они находятся в разных местах (вроде как \assembly\GAC\ vs \assembly\GAC_MSIL\)...
Re[3]: Конфликт сборок с одинаковыми AssembyName и прочим
От: Ziaw Россия  
Дата: 15.01.09 08:05
Оценка: +1
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Там ного кода — не факт, что получится.

ildasm | change AssemblyName | ilasm
получится всегда, если Вася не использовал хитрых обфускаций.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.