我的应用程序包含一个插件架构,其中放置在知名目录的子目录中的符合特定条件的DLL将根据需要加载到应用程序中。
插件组件并非总是独立的。有时需要一些库DLL。它们放在每个插件组件旁边。它们不符合插件标准,因此它们不会作为插件加载,但它们会被插件加载。
有时,多个插件使用相同库的完全相同版本。然后在多个插件目录中有相关DLL的副本。
这一切都正常,直到某人确定他们不需要某个插件并删除其子目录。应用程序检测到这很好,所以它不会再尝试使用该插件。但是,如果该插件具有另一个插件也使用的库DLL的副本,则可能会遇到异常。
我相信这是因为.Net只会在每次运行应用程序时加载一次特定版本的库。它加载它的特定文件就是首先使用的插件旁边的文件。如果该插件恰好是已被删除的插件,则使用相同库的任何其他插件都会爆炸,因为他们尝试使用现在删除的DLL。
使用Assembly.LoadFrom(path)加载插件程序集。我不认为我可以使用LoadFile(路径),因为这不能处理对其他DLL的引用。我不能使用Load(typename),因为我拥有的是路径,而不是类型名称。
重新启动应用程序可以解决问题,但目前只能在发生故障后“手动”发生。
有没有人建议: -
答案 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>