.NET (C#) 应用程序插件的依赖地狱
Dependency Hell on .NET (C#) Application Plugin
我目前正在为第 3 方 WindowsForms 应用程序开发一个插件,它将与其他插件共存。请注意,我无法控制基本应用程序使用的源或文件(是 dll 文件、配置文件等),也无法控制可能在运行时加载的其他插件。
让我们想象一下,当其他插件之一在我的之前加载时,加载了对库 A 的 1.0 版的依赖项(“A.dll”)。如果我的插件尝试加载库 A 的 2.0 版(也称为“A.dll”),我会立即看到经典的“System.IO.FileLoadException”。
在深入了解依赖地狱这个主题后,我看到了几个选项(比如 here or here )。然而,所有这些选项似乎都集中在独立应用程序上,开发人员通常可以完全控制这些应用程序,这些应用程序需要加载同一库的两个版本(可能是为了遗留支持或任何其他奇怪的原因)。由于插件环境,这些解决方案似乎不适用于我的情况。此外,他们通常需要:
- 在 GAC 中插入程序集,AFAIK 需要在最终用户的计算机上拥有管理权限,而我没有;
- 控制基本应用程序的配置文件 (*.exe.config),我没有。
任何人都可以帮我想出一种方法来使用新版本的库,该库也被另一个插件用作旧版本,记住我描述的限制?
如果您自己提供库 A.dll 2.0 版,您可以将其重命名为 A.2。0.dll 并引用它。
您可以处理事件 AppDomain.AssemblyResolve 以控制使用哪个程序集,具体取决于哪个程序集试图加载它。对我来说似乎是一个黑客,但可能没有解决这个问题的干净方法。
我目前正在为第 3 方 WindowsForms 应用程序开发一个插件,它将与其他插件共存。请注意,我无法控制基本应用程序使用的源或文件(是 dll 文件、配置文件等),也无法控制可能在运行时加载的其他插件。
让我们想象一下,当其他插件之一在我的之前加载时,加载了对库 A 的 1.0 版的依赖项(“A.dll”)。如果我的插件尝试加载库 A 的 2.0 版(也称为“A.dll”),我会立即看到经典的“System.IO.FileLoadException”。
在深入了解依赖地狱这个主题后,我看到了几个选项(比如 here or here )。然而,所有这些选项似乎都集中在独立应用程序上,开发人员通常可以完全控制这些应用程序,这些应用程序需要加载同一库的两个版本(可能是为了遗留支持或任何其他奇怪的原因)。由于插件环境,这些解决方案似乎不适用于我的情况。此外,他们通常需要:
- 在 GAC 中插入程序集,AFAIK 需要在最终用户的计算机上拥有管理权限,而我没有;
- 控制基本应用程序的配置文件 (*.exe.config),我没有。
任何人都可以帮我想出一种方法来使用新版本的库,该库也被另一个插件用作旧版本,记住我描述的限制?
如果您自己提供库 A.dll 2.0 版,您可以将其重命名为 A.2。0.dll 并引用它。
您可以处理事件 AppDomain.AssemblyResolve 以控制使用哪个程序集,具体取决于哪个程序集试图加载它。对我来说似乎是一个黑客,但可能没有解决这个问题的干净方法。