插件架构

时间:2010-12-13 21:16:48

标签: c# asp.net

我正在尝试了解插件架构。特别是在Windows Live Writer的实现中使用的那个。我指的是你可以通过添加/删除DLL(+ config)来配置/启用/禁用/添加/删除其他功能的样式。

我希望看到基于网络的应用程序有类似的东西。有人可以指出我正确的方向吗?

提前致谢。

-SK

4 个答案:

答案 0 :(得分:3)

看看这个article。简而言之,您需要在高级别上执行以下操作。

  1. 定义插件必须实现的接口
  2. 创建一个子目录,其中包含对插件dll具有特定权限的子目录
  3. 定义配置节或文件,指定要从插件dll动态加载的类型。
  4. 从插件配置加载dll&使用AppDomain将目录导入安全沙箱
  5. 我希望这会有所帮助。

答案 1 :(得分:1)

您的问题已使用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团队的问题,所以它更有前途。

答案 2 :(得分:0)

基本上,您需要使用AssemblyLoader在运行时从指定目录加载程序集,然后创建一个实例并调用它。

    Assembly assembly = Assembly.LoadFrom("myAssembly.dll");
    Type type = assembly.GetType("theType");
    object myInstance = Activator.CreateInstance(type);

如果所有插件都实现了一个暴露某种方法的接口,那就最好了......比如Load()。然后你可以这样做:

myInstance.Load()

如果您将myInstance强制转换为界面。

答案 3 :(得分:0)

只需添加DLL即可自动检测插件,并封装在System.Addin命名空间中。每次重新启动程序时,它都会添加/删除给定的插件。如您所见,它不会在程序仍在运行时添加/删除插件。如果您需要该功能,则需要通过添加自己的文件事件机制来增强System.Addin代码,该机制会通知您已添加或删除了DLL。当然,如果你想删除一个同时执行的DLL,那DLL就不能有文件锁。为此,您可以在启用ShadowCopy的情况下执行每个DLL。