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