共享库的插件程序集

时间:2013-06-04 12:34:28

标签: c# .net

我的应用程序包含一个插件架构,其中放置在知名目录的子目录中的符合特定条件的DLL将根据需要加载到应用程序中。

插件组件并非总是独立的。有时需要一些库DLL。它们放在每个插件组件旁边。它们不符合插件标准,因此它们不会作为插件加载,但它们会被插件加载

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

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

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

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

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

有没有人建议: -

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

1 个答案:

答案 0 :(得分: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>