2016-01-05 6 views
0

У меня есть приложение, которое загружает плагины по требованию (использует AppDomain и MarshalByRefObject), и я пытаюсь найти другой способ проверки плагина.Найти основной класс, который наследуется от X без использования GetTypes?

Прямо сейчас, я отождествляю запуска-возможности плагинов, как это:

_pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName); 
foreach (var type in _pluginAassembly.GetTypes().Where(type => type.GetInterface("IPluginChat") != null || type.GetInterface("IPlugin") != null)) 
{ 
    _instance = Activator.CreateInstance(type, null, null); 
    return ((IPlugin)_instance).Check(); 
} 

Однако, если один из плагинов затемненный GetTypes не сможет мгновенно:

Could not load type 'Invalid_Token.0x01003FFF' from assembly 'SimplePlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

Следовательно, этот метод не позволит мне запускать оба запутанных и не обфусканных плагина.

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

Короче говоря, существует ли способ найти мой основной класс, который наследуется от одного из двух упомянутых интерфейсов (IPlugin или IPluginChat) без использования GetTypes, который не может прочитать обфускации типов?

+0

Почему вы не использовать пользовательские атрибуты для классов плагинов? – Waxoft

ответ

1

Действительно, вы можете использовать ключевое слово «is», оно вернет true, если указанный экземпляр имеет определенный тип.

Вот очень простой пример:

interface a 
    { 

     int doIt(); 

    } 

    interface b 
    { 

     int doItAgain(); 

    } 

    class c : a, b 
    { 

     public int doIt() { return 1; } 
     public int doItAgain() { return 2; } 

    } 

    var instance = new c(); 

    var isA = instance is a; //true 
    var isB = instance is b; //true 
    var isAForm = instance is Form; //false 
+0

Да, но я не знаю названия основного класса, поэтому у меня был цикл. Короче говоря, мне нужен автоматический способ найти класс, который наследуется от данного интерфейса, не используя GetTypes и зная имя класса, в отличие от вашего примера ... – Guapo

+0

Тогда нет способа узнать типы на сборке, если вы не используете GetTypes. Оборудуйте GetTypes() с помощью try/catch, и если в методе reflectiontypeloadexception используется список типов в аргументах исключения, он будет иметь нулевое значение для неудачных типов. Проверьте этот ответ для получения дополнительной информации: http://stackoverflow.com/questions/7889228/how-to-prevent-reflectiontypeloadexception-when-calling-assembly-gettypes – Gusman

+0

bullseye, ответ в вашем комментарии работает;) – Guapo