0

我需要为我们的应用程序(.NET、WinForms 3.5)设计一个简单的插件框架。

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

我希望这个工作的方式是:

  1. 有一个插件文件夹,用户将在其中放置插件 DLL(包含从特定基类派生的类型/以某种方式标记的程序集)。

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

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

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

我正在寻找一种简单的方法来进行注册,并且只在需要时“懒惰地”加载插件程序集(如果需要的话)。

4

2 回答 2

1

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

否则,正如您所指出的,检查插件程序集会将其加载到内存中。我发现避免这种情况的唯一方法是将它们加载到单独AppDomainAppDomain. 在某处有一个为 PRISM 执行此操作的示例(我可以尝试追踪它),但我不确定您使用的是什么框架(MEF、MAF、PRISM、IoC 等)。

于 2012-08-27T19:53:21.747 回答
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重载创建加载项实例。

于 2012-10-16T13:24:14.767 回答