在不使用 GetTypes 的情况下找到从 X 继承的 main class?

Find main class that inherits from X without using GetTypes?

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

现在,我确定 运行-able 插件是这样的:

_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'.

因此,此方法不允许我 运行 混淆和非混淆插件。

我知道我需要插件有接口导入方法和主要 class 不被混淆才能工作。

简而言之,有没有一种方法可以找到我的主要 class,它继承自上述 2 个接口(IPlugin 或 IPluginChat)之一,而不必使用无法读取混淆类型的 GetTypes?

确实可以,使用 "is" 关键字,如果指定的实例是某种类型,它将 return 为真。

这是一个非常简单的例子:

    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