【问题标题】:Plugin architecture [closed]插件架构
【发布时间】:2011-05-24 22:19:29
【问题描述】:

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

我希望在基于 Web 的应用程序中看到类似的东西。谁能指点我正确的方向?

提前致谢。

-SK

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您的问题被标记为 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 团队的问题,因此它更有前景。

      【讨论】:

      • MEF 不会取代 MAF。 MEF 是关于可扩展性,MAF 是关于隔离。
      【解决方案3】:

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

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

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

      myInstance.Load()
      

      如果您将 myInstance 转换为您的界面。

      【讨论】:

      • 这样做的问题在于它会产生安全风险。最好使用AppDomain 加载到沙箱中。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多