C# 程序集版本匹配是如何工作的?

C# 程序集版本匹配是如何工作的?,c#,.net,C#,.net,假设GAC中有版本为1.1.1.5、1.1.5.1、1.1.6.2、1.2.1.1和2.1.2.1的程序集。我的应用程序具有1.1.3.0版本的引用。运行时将匹配哪个程序集?程序集匹配的实际规则是什么?如果引用需要特定的版本,默认情况下,它将在加载程序集时失败,因为该版本不存在 但是,这可以通过以下方式进行配置。这里将发生的事情有多种选择,包括: 引用可以说它不关心版本控制,在这种情况下,将加载最新版本 您可以指定如何重定向绑定 GAC中的程序集可以是指定如何处理此问题的程序集 运行时将匹配

假设GAC中有版本为1.1.1.5、1.1.5.1、1.1.6.2、1.2.1.1和2.1.2.1的程序集。我的应用程序具有1.1.3.0版本的引用。运行时将匹配哪个程序集?程序集匹配的实际规则是什么?

如果引用需要特定的版本,默认情况下,它将在加载程序集时失败,因为该版本不存在

但是,这可以通过以下方式进行配置。这里将发生的事情有多种选择,包括:

  • 引用可以说它不关心版本控制,在这种情况下,将加载最新版本
  • 您可以指定如何重定向绑定
  • GAC中的程序集可以是指定如何处理此问题的程序集
运行时将匹配哪个程序集

没有匹配的,你的程序会爆炸

Version类的文档一般讨论如何选择版本号。是的,您通常认为生成号的更改是非破坏性的更改。修改后的版本风险较低。当你选择[汇编语言文件]时会考虑的事情。< /P>
但是,默认CLR策略不实现[AssemblyVersion]的这种解释,它坚持精确匹配。只有当它找到与您编译程序使用的DLL完全相同的DLL时,它才会感到高兴。这通常不难确保。您可以覆盖此策略并使其更弱,尽管您应该始终对此三思而后行。在源代码中有一个很长的历史,就是在实践中没有得到很好的结果。这是微软非常熟悉的东西,需要维护几十年的代码。在CLR中,针对DLL地狱的默认对策非常难。应该如此。把它向上推。

你确定吗?因为本文档说明,
具有相同名称、主要版本号和次要版本号但版本不同的程序集是完全可互换的
@user960567我有绑定/加载错误,甚至只是版本号不匹配。这就是目的,但策略文件仍然需要存在。@user960567否-文档中说“当您希望匹配时使用此版本控制方案”-它没有说“运行时将导致此匹配”-这仍然需要一个策略文件。该文件在何处显示,以及设置所显示的内容与版本控制无关?意味着位于的文档是错误的。我已经在Framework1.1中对此进行了测试,它选择了与major.minor匹配的版本。是否在4.0中进行了更改?@user您链接到的文档与此答案不矛盾。您正在阅读的部分可能在“备注”部分,该部分讨论约定。这正是汉斯在中间段落中所说的。正如一些一般性建议一样,如果您对像1.1这样的旧框架中的行为感兴趣,应该在您的问题中明确提到。回答者倾向于假设当前或当前-1版本。