2012-08-27 32 views
0

我需要为我们的应用程序(.NET,WinForms 3.5)设计一个简单的插件框架。插件注册时没有实例化插件类

扩展点将是几个应用程序事件/场景,用户可以使用插件“挂钩”来执行特定操作。

我想这对工作的方式是:

  1. 有一个插件文件夹,用户将放置插件的DLL(含有/从特定基类派生的类型标记不知何故组件)。

  2. 让我的应用程序插件系统找到这些文件并注册它们以备后用。

  3. 在正确的时间调用正确的插件(例如:OnException,OnLog等)。

如果我将在注册时创建插件对象(新建),该DLL将被加载到进程内存中。

我正在寻找一种简单的方法做了登记,并仅在需要时“懒洋洋地”加载插件组装,(如果需要的话)。

+0

可能偏离主题,但为什么经过的延迟加载插件的努力?为自己节省一两个启动时间似乎并不值得。 –

回答

1

你有几个选项 - 如果你能够,你可以要求每个插件提供一个清单或其他文件来描述自己,然后你可以检查所有清单并在必要时加载适当的插件。这样可以避免检查程序集,但它确实需要清单和程序集之间的一致性,这可能会非常棘手。

否则,如您所示,检查插件程序集会将其加载到内存中。我发现要避免这种情况的唯一方法是将它们加载到单独的AppDomain中,检查它们并捕获必要的信息,然后卸载AppDomain。有这样的PRISM的地方(我可以尝试追查)的例子,但我不知道你使用的是什么框架(MEF,MAF,PRISM,国际奥委会等)。

1

在新的AppDomain加载每个候选组合,体现了它的类型和最后卸载的AppDomain的选择,你可以尝试Mono.Cecil。然后,您将不得不做这样的事情:

AssemblyDefinition ad = AssemblyDefinition.ReadAssembly(assemblyPath); 

foreach (TypeDefinition td in ad.MainModule.GetTypes()) 
{ 
    if (td.BaseType != null && td.BaseType.FullName == "MyNamespace.MyAddInBase") 
    {   
     return true; 
    } 
} 

然后你就可以加载使用Assembly.LoadForm正确的组件,最后创建使用Activator.CreateInstance超载适合您的需要加载项的实例。