在不使用GetTypes的情况下查找从X继承的主类?

时间:2016-01-05 13:36:06

标签: c# plugins obfuscation appdomain marshalbyrefobject

我有一个按需加载插件的应用程序(使用AppDomain和MarshalByRefObject),我试图找到一种不同的方法来验证插件。

现在,我确定了这样的可运行插件:

_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?

1 个答案:

答案 0 :(得分: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