Узнать есть ли Интерфейс в частично загруженной сборке ?
От: Nikolay_P_I  
Дата: 24.03.10 08:32
Оценка:
Есть кучка плагинов.

Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?

Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.

Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
reflection plugin
Re: Узнать есть ли Интерфейс в частично загруженной сборке ?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.03.10 08:36
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать


Ну, например, Mono.Cecil
Re[2]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Nikolay_P_I  
Дата: 24.03.10 09:24
Оценка:
Здравствуйте, nikov, Вы писали:

N_P>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать

N>Ну, например, Mono.Cecil

Не настолько шаманство — Mono не подойдет.
Re[3]: Узнать есть ли Интерфейс в частично загруженной сборк
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.03.10 11:03
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать

N>>Ну, например, Mono.Cecil

N_P>Не настолько шаманство — Mono не подойдет.


Это не Mono, это библиотека Mono.Cecil. Работает и под Microsoft CLR.
Re[2]: Узнать есть ли Интерфейс в частично загруженной сборк
От: desco США http://v2matveev.blogspot.com
Дата: 24.03.10 12:04
Оценка:
Здравствуйте, nikov, Вы писали:

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


N_P>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать


N>Ну, например, Mono.Cecil


или CCI Metadata
Re: Узнать есть ли Интерфейс в частично загруженной сборке ?
От: Brick_1 Украина  
Дата: 24.03.10 15:12
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Есть кучка плагинов.


N_P>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?


N_P>Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.


N_P>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать


Доброго !

....
var aso=FormatterServices.GetTypeFromAssembly(Assembly.LoadFrom(....);
if(aso!=null)
{
var supportedInterfaces=aso.FindInterfaces(SupportedInterfaceFilter,"Namespase.InterfaceName");
// Если поддерживает интерфейс
if(supportedInterfaces.Length!=0)
{
// РАБОТАТЬ С НИМ
}
}

....

private static bool SupportedInterfaceFilter(Type typeObj,Object criteriaObj)
{
return typeObj.ToString()==criteriaObj.ToString();
}

С уважением !
Re[2]: Узнать есть ли Интерфейс в частично загруженной сборк
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.03.10 20:43
Оценка:
Здравствуйте, nikov, Вы писали:

N>Ну, например, Mono.Cecil


Ряд экспериментов проведенных советскими учеными показал, что CCI Metadata качественнее и лучше поддерживается.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Nikolay_P_I  
Дата: 25.03.10 13:05
Оценка:
Здравствуйте, Brick_1, Вы писали:

N_P>>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?

N_P>>Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.
N_P>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
B_>....
B_> var aso=FormatterServices.GetTypeFromAssembly(Assembly.LoadFrom(....);
B_> if(aso!=null)
B_> {
B_> var supportedInterfaces=aso.FindInterfaces(SupportedInterfaceFilter,"Namespase.InterfaceName");
B_> // Если поддерживает интерфейс
B_> if(supportedInterfaces.Length!=0)
B_> {
B_> // РАБОТАТЬ С НИМ
B_> }
B_> }

Не понял ? FormatterServices.GetTypeFromAssembly имеет только 1 прототип Type(Assembly, String) и возвращает только тип с указанным именем. А имя-то типа я не знаю — я знаю только имя интерфейса.
Re[3]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Аноним  
Дата: 25.03.10 13:53
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

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


N_P>>>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?

N_P>>>Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.
N_P>>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
B_>>....
B_>> var aso=FormatterServices.GetTypeFromAssembly(Assembly.LoadFrom(....);
B_>> if(aso!=null)
B_>> {
B_>> var supportedInterfaces=aso.FindInterfaces(SupportedInterfaceFilter,"Namespase.InterfaceName");
B_>> // Если поддерживает интерфейс
B_>> if(supportedInterfaces.Length!=0)
B_>> {
B_>> // РАБОТАТЬ С НИМ
B_>> }
B_>> }

N_P>Не понял ? FormatterServices.GetTypeFromAssembly имеет только 1 прототип Type(Assembly, String) и возвращает только тип с указанным именем. А имя-то типа я не знаю — я знаю только имя интерфейса.


public static Assembly.LoadFrom(string assemblyFile)
Re[4]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Nikolay_P_I  
Дата: 25.03.10 14:44
Оценка:
N_P>>>>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?
N_P>>>>Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.
N_P>>>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
B_>>>....
B_>>> var aso=FormatterServices.GetTypeFromAssembly(Assembly.LoadFrom(....);
B_>>> if(aso!=null)
B_>>> {
B_>>> var supportedInterfaces=aso.FindInterfaces(SupportedInterfaceFilter,"Namespase.InterfaceName");
B_>>> // Если поддерживает интерфейс
B_>>> if(supportedInterfaces.Length!=0)

N_P>>Не понял ? FormatterServices.GetTypeFromAssembly имеет только 1 прототип Type(Assembly, String) и возвращает только тип с указанным именем. А имя-то типа я не знаю — я знаю только имя интерфейса.


А>public static Assembly.LoadFrom(string assemblyFile)


Читайте с начала. Сборка-то загрузится, да после попытки .GetExportedTypes() будет исключение так как нет всех .dll.
Есть .GetTypes(), но, к сожалению, в ее расширенном исключении нет имен типов, которые его вызвали — только null.
Re[3]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Silver_s Ниоткуда  
Дата: 25.03.10 17:55
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Ряд экспериментов проведенных советскими учеными показал, что CCI Metadata качественнее и лучше поддерживается.

Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix
Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.
Re[4]: Узнать есть ли Интерфейс в частично загруженной сборк
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.03.10 18:18
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix

S_>Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.

Похожая, но ориентированная на трансформацию и компиляцию IL-а и машинного кода. Плюс похоже этот проект забросили.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Узнать есть ли Интерфейс в частично загруженной сборк
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.03.10 18:21
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix

S_>Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.

И главное... Он вообще не применим на практике, так как там академическая лицензия смысл которой "смотреть можно, трогать — нельзя", если с тех пор как я смотрел этого Феникса ничего не изменилось, конечно...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Узнать есть ли Интерфейс в частично загруженной сборк
От: Silver_s Ниоткуда  
Дата: 25.03.10 19:19
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Silver_s, Вы писали:

S_>>Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix

S_>>Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.

VD>Похожая, но ориентированная на трансформацию и компиляцию IL-а и машинного кода. Плюс похоже этот проект забросили.

Судя по документации что-то они там хитрое замутили, и IL и машинный код декомпилируют в другой промежуточный язык IR с 4 уровнями конкретизации (от высокого уровня до регистров). И компилятроры должны создавать код в IR потом конвертировать в IL. Я так понял. Что-то сомнительная затея так обобщать.

VD>И главное... Он вообще не применим на практике, так как там академическая лицензия смысл которой "смотреть можно, трогать — нельзя", если с тех пор как я смотрел этого Феникса ничего не изменилось, конечно...


А у CCI какая лицензия? http://ccimetadata.codeplex.com/license
Текст есть, но лицензии читать не умею. :(
Что это значит — можно откомпилировать и бесплатно в бинарном виде распространять в составе комерческих приложений, если в их исходники изменения не вносились?
Re[6]: Узнать есть ли Интерфейс в частично загруженной сборк
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.03.10 19:29
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>А у CCI какая лицензия? http://ccimetadata.codeplex.com/license

S_>Текст есть, но лицензии читать не умею.

А Википедией? Википедией обычно мамы умеют пользоваться (с) рекалама страховой фирмы
http://ru.wikipedia.org/wiki/Microsoft_Public_License#mspl
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Узнать есть ли Интерфейс в частично загруженной сборке ?
От: Gremlin2 http://www.fb2library.net/
Дата: 26.03.10 10:59
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Есть кучка плагинов.


N_P>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?


А если попытаться загрузить при помощи Assembly.ReflectionOnlyLoad?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.