我的应用程序包含一个插件体系结构,其中符合特定标准的 DLL 将根据需要加载到应用程序中,这些 DLL 位于众所周知的目录的子目录中。
插件程序集并不总是独立的。有时需要一些库 DLL。它们位于每个插件程序集旁边。它们不符合插件标准,因此它们不会作为插件加载,而是由插件加载。
有时,多个插件使用同一个库的完全相同的版本。然后在多个插件目录中存在相关 DLL 的副本。
这一切都很好,直到有人决定他们不需要某个插件并删除它的子目录。应用程序检测到这一点很好,因此它不会再尝试使用该插件。但是,如果该插件有一个库 DLL 的副本,该副本也被另一个插件使用,则可能会遇到异常。
我相信会发生这种情况是因为 .Net 每次运行应用程序时只会加载该特定版本的库。它加载它的特定文件是恰好首先使用的插件旁边的文件。如果该插件恰好是被删除的插件,那么使用相同库的任何其他插件都会崩溃,因为它们会尝试使用现在已删除的 DLL。
插件程序集使用 Assembly.LoadFrom(path) 加载。我不认为我可以使用 LoadFile(path),因为它不能处理对其他 DLL 的引用。而且我不能使用 Load(typename),因为我拥有的是路径,而不是类型名称。
重新启动应用程序可以解决问题,但目前仅在失败后“手动”发生。
有没有人有任何建议: -
- 从问题中恢复,例如通过说服 .Net 更改查找该 DLL 的位置
- 说服包含插件的 Web 应用程序在这种情况下自动重新启动
- 重新架构以避免问题(但这是一个成熟的使用中的应用程序,所以我的选择是有限的)