【发布时间】: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 文档——作为这个特定事物的框架,他们可能有解决方案。