Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
依赖.NET(C#)应用程序插件_C#_.net_Winforms_Plugins_Dependency Management - Fatal编程技术网

依赖.NET(C#)应用程序插件

依赖.NET(C#)应用程序插件,c#,.net,winforms,plugins,dependency-management,C#,.net,Winforms,Plugins,Dependency Management,我目前正在为第三方WindowsForms应用程序开发一个插件,它将与其他插件共存。请注意,我无法控制基本应用程序使用的源或文件(即dll文件、配置文件等),也无法控制运行时可能加载的其他插件 让我们想象一下,在我之前加载的其他插件中,有一个插件加载了对库a的1.0版本(“a.dll”)的依赖关系。如果我的插件试图加载库A的2.0版(也称为“A.dll”),我会立即收到经典的“System.IO.FileLoadException” 在深入研究依赖地狱这个主题之后,我得到了一些选择(比如或)。然

我目前正在为第三方WindowsForms应用程序开发一个插件,它将与其他插件共存。请注意,我无法控制基本应用程序使用的源或文件(即dll文件、配置文件等),也无法控制运行时可能加载的其他插件

让我们想象一下,在我之前加载的其他插件中,有一个插件加载了对库a的1.0版本(“a.dll”)的依赖关系。如果我的插件试图加载库A的2.0版(也称为“A.dll”),我会立即收到经典的“System.IO.FileLoadException”

在深入研究依赖地狱这个主题之后,我得到了一些选择(比如或)。然而,所有这些选项似乎都集中在独立应用程序上,开发人员通常可以完全控制这些应用程序,它们需要加载同一库的两个版本(可能是因为遗留支持或任何其他奇怪的原因)。由于插件环境的原因,这些解决方案似乎不适用于我的案例。此外,它们通常需要:

  • 在GAC中插入一个程序集,AFAIK将要求对最终用户的机器拥有管理权,而我没有
  • 控制我没有的基本应用程序的配置文件(*.exe.config)

有谁能帮我找到一种方法来使用一个库的更新版本,它也被另一个插件作为旧版本使用,记住我描述的约束条件吗?

如果你自己提供库a.dll版本2.0,您可以将其重命名为A.2.0.dll并引用它。

您可以处理事件AppDomain.AssemblyResolve,根据尝试加载的程序集来控制使用的程序集。对我来说,这似乎是一种黑客行为,但可能没有干净的方法来解决这个问题。

我确实可以控制库a.dll,这是我目前的首选:简单有效。但是,它要求我为每个版本重命名库(为了清楚起见,我简化了这个问题:我的库A.dll对应于一组dll文件)。在使用此选项之前,我只想知道是否还有其他更优雅的选项可以实现此目的。@PedroPinheiro因为所有插件都位于同一目录中,您不能将任何内容放入GAC,我看不到其他选项允许您使用同一文件的多个版本。我们有一个VS扩展,它依赖于流行的框架,如Mono.Cecil,它可能由其他VS扩展加载。对于一些用户,我们确实在生产过程中遇到了冲突。我们的选择是将其重命名为Mono.Cecil.4NDepend.dll,NDepend是我们的产品。4你的产品后缀比版本后缀更好1)你给第三方重命名过一次2)谁知道是否没有版本冲突谢谢大家的帮助。我在我的项目中成功地采用了这个重命名策略,我可以确认它解决了我最初的问题。我同意你的观点,这看起来像是一个黑客行为。但是,AppDomain.AssemblyResolve应该由应用程序上的每个插件处理,不是吗?这可能会造成一个问题,因为我无法控制应用程序上的其他插件,我无法强制它们使用这种方法。。。这就是为什么我更倾向于使用MarTim提出的解决方案,即使它不是一个理想的解决方案…因为其他程序集与您的程序集位于同一appdomain上,所以我认为您是安全的…您只需确保您的插件是否请求程序集(或者是否请求您的插件版本)返回正确的程序集。如果忽略所有其他调用,则将为应用程序的其余部分重新调整assemlby的默认版本。