【发布时间】:2011-05-24 22:19:29
【问题描述】:
我正在尝试了解插件架构。特别是在 Windows Live Writer 的实现中使用的一种。我指的是您可以通过添加/删除 DLL (+ config) 来配置/启用/禁用/添加/删除附加功能的样式。
我希望在基于 Web 的应用程序中看到类似的东西。谁能指点我正确的方向?
提前致谢。
-SK
【问题讨论】:
我正在尝试了解插件架构。特别是在 Windows Live Writer 的实现中使用的一种。我指的是您可以通过添加/删除 DLL (+ config) 来配置/启用/禁用/添加/删除附加功能的样式。
我希望在基于 Web 的应用程序中看到类似的东西。谁能指点我正确的方向?
提前致谢。
-SK
【问题讨论】:
看看这个article。简而言之,您需要在高层次上执行以下操作。
我希望这会有所帮助。
【讨论】:
您的问题被标记为 ASP.NET,但我没有在您的问题中看到任何 ASP.NET 特定内容。可插入的 ASP.NET 是可能的,但很难使用 System.AddIn,即 MAF。我设法在大约 4 天内创建了一个安全的网站插件概念验证。
http://suburbandestiny.com/Tech/?p=585
http://suburbandestiny.com/Tech/?p=588
最酷的事情是终于能够以最低信任运行加载项 dll,而主机应用程序则以完全或中等信任运行。
我最终得出结论,创建 System.AddIn 是为了解决 Microsoft Office 面临的 AddIn 挑战,而不是为 web.app 创建 AddIn 的挑战。
MEF 应该是做插件类型模式的新亮点,但我没有任何经验。 MEF 旨在成为一种通用解决方案,而不仅仅是解决 MS Office 团队的问题,因此它更有前景。
【讨论】:
基本上,您需要使用 AssemblyLoader 在运行时从指定目录加载程序集,然后创建一个实例并调用它。
Assembly assembly = Assembly.LoadFrom("myAssembly.dll");
Type type = assembly.GetType("theType");
object myInstance = Activator.CreateInstance(type);
如果你所有的插件都实现了一个接口来暴露某种方法……比如 Load(),那么效果最好。然后你可以这样做:
myInstance.Load()
如果您将 myInstance 转换为您的界面。
【讨论】:
AppDomain 加载到沙箱中。
插件的自动检测,只需添加一个 DLL,封装在 System.Addin 命名空间中。每次重新启动程序时,它都会添加/删除给定的插件。如您所见,它不会在程序仍在运行时添加/删除插件。如果您想要该功能,那么您将需要通过添加您自己的文件事件机制来增强 System.Addin 代码,该机制会通知您添加或删除了 DLL。当然,如果您想删除已经在执行的某个 DLL,则该 DLL 上不能有文件锁。要实现这一点,您需要在打开ShadowCopy 的情况下执行每个 DLL。
【讨论】: