加载任何版本的静态引用的.NET程序集。

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

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

是否可能实现这一点?

程序集版本重定向 允许我在请求不同版本的程序集时加载特定的程序集版本。我的情况则相反;我想加载存在的任何版本。


您是指静态引用或动态加载的程序集吗? - Jeff
我想在构建过程中静态引用程序集,然后(在运行时)实际使用已经存在于目标机器上的副本(可能是稍微不同的版本)。 - Hydrargyrum
动态加载的程序集没有问题,除非它们在静态引用我构建工具时不同版本的相同程序集,导致冲突和不兼容的类型应该是兼容的。这就是为什么我想加载安装文件夹中存在的版本,而不是运送自己的副本。也许这是错误的方法? - Hydrargyrum
2
你仍在使用bindingRedirect。你请求,比如说,版本1.0.0.0,并且对获取任何版本都感到满意。关键是始终使用相同的引用程序集,因此您始终请求1.0.0.0。现在复制一份并将其检入源代码控制。迟早你会后悔的。迟早。 - Hans Passant
1个回答

3
您可以绑定到AppDomain.CurrentDomain.AssemblyResolve事件并自行处理解决方案。

这是大多数程序集动态解析的方式(仅基于程序集名称)。我没有意识到可以使用不同的强名称(由于版本号不同)加载静态引用的程序集。我会试一试。 - Hydrargyrum
作为参考,我找到了一些文档明确说明事件处理程序可以返回与请求的版本不同的程序集版本。 - Hydrargyrum
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Hydrargyrum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接