1

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

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

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

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

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

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

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

有没有人有任何建议: -

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

1 回答 1

0

简单的方法是使用 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>
于 2013-06-07T11:43:46.047 回答