【问题标题】:How CLR will identify Assmebly version change?CLR 将如何识别程序集版本更改?
【发布时间】:2013-05-31 09:05:52
【问题描述】:

此页面http://support.microsoft.com/kb/556041 清楚地解释了 AssemblyVersion 和 AssemblyFile 版本之间的区别。

此页面还说明了何时更改两者。我还有一个问题,

假设我交付了一个带有 Assembly 版本 1 的 dot net 组件,现在由于它经常更改,因此我只更改 AssemblyFileVersion。然后我正在复制我的新组件,CLR 将如何知道我的程序集版本不会改变。现在两个组件(旧的和新的)都有相同的 assemblyVersions,那么 CLR 将如何识别要使用的组件呢?

【问题讨论】:

    标签: .net version .net-assembly


    【解决方案1】:

    CLR 确实不关注 [AssemblyFileVersion]。它只是一个参考编号,例如您可以在 Windows 资源管理器中看到它。通常的方法是在发货前重建程序集时增加它。将小错误修复分开的方法。

    大狗是 [AssemblyVersion],CLR 非常关注那个。当它在运行时找到程序集时,该版本必须与您构建程序时使用的参考程序集相匹配。如果没有,则 CLR 假定 DLL Hell 发生并拒绝运行该程序。这对 GAC 也很重要,您可以在其中存储多个同名但版本不同的 DLL。这是 DLL Hell 对策。

    因此,当您在程序集的公共接口中进行重大更改时,增加 [AssemblyVersion] 是必要的。如果不重新编译或以其他方式调整以处理更改,那么使用程序集的程序会失败的机会。所以用户会得到一个明确的错误信息,而不是某种难以诊断的异常。或者更糟的是,根本没有例外,只是无法诊断的不当行为。

    您可以确保 [AssemblyVersion] 递增。实际上这样做并不容易,许多公司在发布更新时只是自动增加 [AssemblyVersion],即使没有更改或更改没有中断。 .NET 通过在属性中使用星号 (*) 支持。这样比较安全。但随后附加要求也更新任何依赖程序。这当然不稀奇。

    【讨论】:

    • 感谢您的解释。我还有一个问题如果我有 2 个版本的 dll(一个带有旧的程序集版本,另一个带有新的 assemblyversion),那么 CLR 会选择哪个 DLL?这是您提到的 DLL Hell 的情况吗?对不起,如果我问错了问题。只是我想澄清我的疑问..
    • CLR 不选择。如果程序集在 GAC 中,那么它将选择具有正确版本的程序集。如果没有,那么它将加载它在 EXE 目录中找到的任何 DLL。 Kaboom 如果那不是正确的版本。您只能通过更改 DLL 而不是更改 [AssemblyVersion] 来搞砸这个。这是自己造成的。
    • 感谢您的支持。我必须学习深度点网..你能推荐任何好的材料或链接来从基础到深度学习点网吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多