0

我有一个按需加载插件的应用程序(使用 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'.

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

我知道我会要求插件具有接口导入的方法和主类不被混淆才能工作。

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

4

1 回答 1

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
于 2016-01-05T13:46:49.850 回答