Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?
Для чего надо — если это просто сервисная сборка из которой плагин использует половину, то тихо ее пропустить, если это сам плагин без важных библиотек — юзер должен об этом знать.
Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать N>>Ну, например, Mono.Cecil
N_P>Не настолько шаманство — Mono не подойдет.
Это не Mono, это библиотека Mono.Cecil. Работает и под Microsoft CLR.
Re[2]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Nikolay_P_I, Вы писали:
N_P>>Подойдет любое шаманство — даже загрузить .dll как текст и слова поискать
N>Ну, например, Mono.Cecil
Здравствуйте, 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)
{
// РАБОТАТЬ С НИМ
}
}
Здравствуйте, 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]: Узнать есть ли Интерфейс в частично загруженной сборк
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]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, VladD2, Вы писали: VD>Ряд экспериментов проведенных советскими учеными показал, что CCI Metadata качественнее и лучше поддерживается.
Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix
Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.
Re[4]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, Silver_s, Вы писали:
S_>Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix S_>Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.
Похожая, но ориентированная на трансформацию и компиляцию IL-а и машинного кода. Плюс похоже этот проект забросили.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, Silver_s, Вы писали:
S_>Кстати, а это что за монстр Phoenix? https://connect.microsoft.com/Phoenix S_>Кто-нибудь его ковырял? Хотя он не совсем для .NET сборок, хоть и на .NET написан.
И главное... Он вообще не применим на практике, так как там академическая лицензия смысл которой "смотреть можно, трогать — нельзя", если с тех пор как я смотрел этого Феникса ничего не изменилось, конечно...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, 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]: Узнать есть ли Интерфейс в частично загруженной сборк
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Есть кучка плагинов.
N_P>Проблема — как отличить плагин, в котором НЕТ нужного интерфейса от плагина в котором он ЕСТЬ. При том условии, что .GetExportedTypes() после Assemby.Load() сделать не удается так как не хватает каких-то .dll ?
А если попытаться загрузить при помощи Assembly.ReflectionOnlyLoad?