【问题标题】:Load any version of a statically referenced .NET assembly加载任何版本的静态引用的 .NET 程序集
【发布时间】:2016-03-15 13:02:49
【问题描述】:

我正在开发一个使用其他产品的 .NET 程序集的工具。在我的项目中静态引用了一些程序集(使用“添加引用”),因为我需要在我的代码中实际使用这些类型。但是我从产品的安装目录中动态加载了许多其他程序集,使用反射来动态实例化我需要的任何对象。

我不想为我所依赖的每个可能版本的产品重新编译和发布我的项目的单独版本。 一些我需要的程序集版本肯定会出现在应用程序安装目录中,所以我想使用恰好安装的任何版本的程序集。但它可能与我最初在构建工具时使用的程序集版本不完全相同。 (产品版本控制策略是,产品中的所有程序集都具有相同的版本号,每个版本都会更改,即使我需要静态引用的特定程序集自上一个版本以来没有改变,或者支持 100%我需要的 API)。

有可能实现吗?

Assembly Version redirects 允许我在请求该程序集的不同 版本时加载该程序集的特定版本。我的情况正好相反。我想加载碰巧存在的任何版本。

【问题讨论】:

  • 你指的是静态引用还是动态加载的程序集?
  • 我想在我的构建过程中静态引用程序集,然后(在运行时)实际使用目标机器上已经存在的副本(可能版本略有不同)。
  • 动态加载的程序集没有问题,除非它们本身静态引用我在构建工具时引用的相同程序集的不同版本,从而导致冲突和不兼容的类型应该兼容。这就是为什么我想加载安装文件夹中存在的版本而不是发送我自己的副本。也许这是错误的方法?
  • 您仍然使用绑定重定向。例如,您要求版本 1.0.0.0,并且您很高兴获得任何版本。关键是始终使用相同的参考程序集,因此您始终要求使用 1.0.0.0。现在制作一个副本,将其签入源代码管理。你迟早会后悔。稍后。

标签: c# .net .net-assembly assembly-resolution


【解决方案1】:

您可以绑定到 AppDomain.CurrentDomain.AssmeblyResolve 事件并自行处理解析。

【讨论】:

  • 这是动态解析大多数程序集的方式(仅基于程序集名称)。我没有意识到加载具有不同强名称的静态引用程序集(由于版本号不同)会起作用。我试试看。
  • 是的,这种方法有效。我需要做的就是删除包含在我的项目输出文件夹中的不匹配程序集,以便运行时不会先加载它们,然后从同一个文件夹动态加载所有内容,并具有匹配的一致版本。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2010-10-27
  • 2010-10-14
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多