插件架构

5
我正在尝试理解插件架构,特别是在Windows Live Writer的实现中使用的插件架构。我指的是通过添加/删除DLL(+配置)来配置/启用/禁用/添加/删除附加功能的样式。
我希望看到类似于Web应用程序的东西。请问有人可以指引我正确的方向吗?
提前致谢。
-SK
4个回答

3

请看这个文章。简而言之,您需要在高层次上执行以下操作:

  1. 定义插件必须实现的接口
  2. 创建一个子目录,为插件dll提供特定的权限
  3. 定义一个配置部分或文件,指定从插件dll中动态加载的类型。
  4. 使用AppDomain将插件配置和目录中的dll加载到安全沙箱中

希望这可以帮到您。


1

你的问题被标记为ASP.NET,但我在你的问题中没有看到任何与ASP.NET相关的内容。使用System.AddIn(又名MAF)可以实现可插拔的ASP.NET,但这很困难。我设法在大约4天内创建了一个安全的网站插件概念证明。

http://suburbandestiny.com/Tech/?p=585

http://suburbandestiny.com/Tech/?p=588

很酷的事情是最终能够在最小信任级别下运行Add-In dll,而宿主应用程序在完全或中等信任级别下运行。

我最终得出结论,System.AddIn是为解决Microsoft Office面临的AddIn挑战而创建的,而不是为了创建Web.app的AddIn所面临的挑战。

MEF应该是新的闪亮点来做插件类型模式,但我没有任何经验。 MEF旨在成为通用解决方案,而不仅仅是解决MS Office团队的问题,因此更具有前途。


MEF并不取代MAF。MEF关注的是可扩展性,而MAF则关注隔离性。 - Brent Arias

0
基本上,您需要使用AssemblyLoader在运行时从指定目录加载程序集,然后创建一个实例并调用它。
    Assembly assembly = Assembly.LoadFrom("myAssembly.dll");
    Type type = assembly.GetType("theType");
    object myInstance = Activator.CreateInstance(type);

如果您的所有插件都实现了公开某个方法(例如Load())的接口,则最好使用它。然后,您可以执行以下操作:

myInstance.Load()

假如你将myInstance强制转换为你的接口。


3
问题在于这样做会产生安全风险。最好使用“AppDomain”加载到一个沙箱中。 - James

0

通过添加DLL,自动检测插件的功能被封装在System.Addin命名空间中。每次重新启动程序时,它都会添加/删除给定的插件。正如您所看到的,它不会在程序仍在运行时添加/删除插件。如果您需要这种功能,则需要通过添加自己的文件事件机制来增强System.Addin代码,以通知您已添加或删除DLL。当然,如果您想要删除正在执行的DLL,则该DLL不能被文件锁定。为了实现这一点,您需要打开ShadowCopy并执行每个DLL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接