Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 共享库的插件程序集_C#_.net - Fatal编程技术网

C# 共享库的插件程序集

C# 共享库的插件程序集,c#,.net,C#,.net,我的应用程序包括一个插件体系结构,在该体系结构中,放置在已知目录子目录中的符合特定条件的DLL将根据需要加载到应用程序中 插件程序集并不总是自包含的。有时需要一些库DLL。它们放置在每个插件部件旁边。它们不符合插件标准,因此它们不会作为插件加载,而是通过插件加载 有时,多个插件使用同一库的完全相同版本。然后,在多个插件目录中存在关联DLL的副本 在有人决定不需要某个插件并删除其子目录之前,这一切都可以正常工作。应用程序检测到这一点很好,因此不再尝试使用该插件。但是,如果该插件有一个库DLL的副本

我的应用程序包括一个插件体系结构,在该体系结构中,放置在已知目录子目录中的符合特定条件的DLL将根据需要加载到应用程序中

插件程序集并不总是自包含的。有时需要一些库DLL。它们放置在每个插件部件旁边。它们不符合插件标准,因此它们不会作为插件加载,而是通过插件加载

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

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

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

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

重新启动应用程序可以解决问题,但目前仅在出现故障后“手动”进行

是否有人有以下建议:-

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

简单的方法是使用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>

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