【问题标题】:plug-in assemblies sharing a library共享库的插件程序集
【发布时间】:2013-06-07 19:43:46
【问题描述】:

我的应用程序包含一个插件架构,在该架构中,符合特定标准的 DLL 将根据需要加载到应用程序中,这些 DLL 位于众所周知的目录的子目录中。

插件程序集并不总是独立的。有时需要一些库 DLL。它们位于每个插件程序集旁边。它们不符合插件标准,因此它们不会作为插件加载,而是通过插件加载。

有时,多个插件使用同一个库的完全相同版本。然后在多个插件目录中存在相关 DLL 的副本。

这一切都很好,直到有人决定他们不需要某个插件并删除它的子目录。应用程序检测到这一点很好,因此它不会再尝试使用该插件。但是,如果该插件有一个库 DLL 的副本也被另一个插件使用,则可能会遇到异常。

我相信会发生这种情况是因为 .Net 每次运行应用程序时只会加载该库的特定版本一次。它加载它的特定文件是恰好首先使用的插件旁边的文件。如果该插件恰好是被删除的插件,那么使用相同库的任何其他插件都会崩溃,因为它们会尝试使用现在已删除的 DLL。

插件程序集是使用 Assembly.LoadFrom(path) 加载的。我不认为我可以使用 LoadFile(path),因为它不能处理对其他 DLL 的引用。而且我不能使用 Load(typename),因为我拥有的是路径,而不是类型名称。

重新启动应用程序可以解决问题,但目前只能在失败后“手动”发生。

有没有人建议:-

  • 从问题中恢复,例如通过说服 .Net 更改查找该 DLL 的位置
  • 说服包含插件的 Web 应用程序在这种情况下自动重新启动
  • 重新架构以避免问题(但这是一个成熟的使用中的应用程序,所以我的选择有限)

【问题讨论】:

  • 查看 MEF 文档——作为这个特定事物的框架,他们可能有解决方案。

标签: c# .net


【解决方案1】:

简单的方法是使用 xml 标识插件、公共引用及其依赖项。公共参考部分将包含其他插件所依赖的所有 dll,并放置在单独的文件夹中。像下面这样的东西应该适合你:

<CommonReferences>
   <Dll id="" path="" version=""/>
   <Dll id="" path="" version=""/>
</CommonReferences>
<Plugins>
   <Plugin id="" path="" version="">
     <Dependencies>
         <DependencyDll id="" path="" version=""/>
         <DependencyDll id="" path="" version=""/>
         <DependencyDll id="" path="" version=""/>
     </Dependencies>
   </Plugin>
</Plugins>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多