【问题标题】:How do I make automatic version numbers work in Visual Studio如何使自动版本号在 Visual Studio 中工作
【发布时间】:2011-05-09 12:43:21
【问题描述】:

有人要求我为代码库中的程序集添加自动编号。我一直在将版本从默认的 1.0.0.0 更改为 1.0.*,如下所示:

[程序集:AssemblyVersion("1.0.*")]

它会生成一个我想要的数字。

但是,代码库有数百个 DLL,其中许多相互引用。现在,当我编译一些项目时,他们抱怨引用组件所需的 DLL 版本不正确并且他们不会构建:(

我怎样才能做到这一点?我们需要它,以便在编译代码库层次结构底部的 DLL 时,引用它的所有其他 DLL 都可以正常工作,而无需重新编译。

我得到的错误是这样的:

Error   1   CA0058 : The referenced assembly 'Library1, Version=1.0.4146.17993
, Culture=neutral, PublicKeyToken=d9c65edd2096ad48' could not be found. This assembly
is required for analysis and was referenced by:
D:\Work\Source Code\Library\Library2\bin\Release\Library2.dll.

版本 1.0.4146.17993 不正确 - DLL 具有更高的值。 DLL 设置为 Copy Local,因为我们提供的软件需要它(不要问为什么)。本地复制的 DLL 是版本号较高的那个,也就是我们想要的那个。

到目前为止,我已尝试更改引用以将“特定版本”标志设置为 false,但这没有帮助。

【问题讨论】:

    标签: c# visual-studio


    【解决方案1】:

    当您使用1.0.* 语法时VS 生成的版本号不一定会按序列 递增。 documentation 有这个说法(强调):

    您可以指定所有值,也可以使用星号 () 接受默认内部版本号、修订号或两者。例如,[assembly:AssemblyVersion("2.3.25.1")] 表示 2 为主要版本,3 为次要版本,25 为内部版本号,1 为修订号。诸如 [assembly:AssemblyVersion("1.2.")] 的版本号指定 1 作为主要版本,2 作为次要版本,并接受默认的构建和修订号。诸如 [assembly:AssemblyVersion("1.2.15.*")] 的版本号指定 1 作为主要版本,2 作为次要版本,15 作为内部版本号,并接受默认修订号。 默认版本号每天递增。默认修订号是随机的。

    如果您获得完全正确的版本控制至关重要,我强烈建议您使用第三方解决方案。 Build Version Increment 插件非常棒。

    您要做的是自己管理程序集版本。仅当您对程序集的公共接口进行重大更改时才增加此值。更改此属性会使您的程序集与引用它的其他程序集不兼容,即使您没有更改代码中的任何内容。相反,您唯一想要自动增加的是程序集 file 版本。与程序集版本不同,CLR 不会检查此属性以确定兼容性。

    Build Version Increment 插件为您提供了一种细粒度的控制,您需要正确地控制增量。它可能应该包含在 VS 中。

    【讨论】:

    • 只要整体版本增加(Visual Studio 系统会根据日期和时间进行操作),我们并不担心版本是否按顺序排列。即使使用手动增量或替代解决方案,我认为我们也会遇到同样的问题。
    • @Richard:确保刷新页面以查看我的最后编辑。如果您更改 [AssemblyVersion] 属性,您将向 CLR 指示该程序集现在与以前的版本不兼容。您需要增加 [AssemblyFileVersion] 属性。 Visual Studio 没有做到这一点,但第 3 方工具可让您更好地控制增加哪个。
    • 最后我回到了固定的程序集版本并手动更新文件版本。对您对在构建时自动执行此操作的工具的任何建议感兴趣。
    • @Richard:你试过Build Version Increment吗?我已经用它来做到这一点。
    • 从.Net 4.5开始,修订号不是随机的,而是计算出来的 > 默认修订号是从当地时间午夜开始的秒数(不考虑夏令时的时区调整),除以2
    【解决方案2】:

    这实际上是一个非常深入的问题,我希望有人为您详细回答这个问题,但是在您控制了程序集信息后,我的 2 美分是您应该考虑使用 Nuget 来管理您的依赖项。这样,当团队 A 发布程序集 X 的 v2 时,他们所做的就是将它放在您的 Nuget 存储库(可能是网络共享)上,然后您基本上可以在使用 DLL 的项目中右键单击

    我还建议查看http://semver.org/ 并使用语义版本控制,如果您不想遵循这样的系统(或为您的商店制定类似的标准),甚至可能不值得尝试对您的DLL 会让您头疼不已。然而,使用语义版本控制将使您的版本号实际上意味着什么。而不仅仅是被标记到当前版本的任何感觉。

    【讨论】:

      【解决方案3】:

      请注意,修订号不是随机的。这是构建的时间。 Build 是天数。

      VisualStudio: translating a build version to a calendar date

      【讨论】:

        【解决方案4】:

        删除您的引用(在使用它的项目中)并通过指向项目引用类型重新执行。

        PS:如果你在添加引用的时候选择浏览并指向一个dll永远存在的地方,引用不会被破坏!

        【讨论】:

        • GAC 中没有一个。这些都是保存在库文件夹中的所有 DLL。
        • @Richard 在大多数情况下,这是修复构建错误的简单答案,很多时候您会在备用项目的 bin 文件夹中获得对 dll 的 FILE 引用,而不是真正的项目参考。通常只需删除引用并通过对话框使用添加项目引用即可修复它。
        • 我认为问题在于项目没有重建。因此,当项目 A 引用库 A 和库 B,库 B 也引用库 A 时,库 A 的真实版本不一定是库 B 知道的版本。所以删除和替换引用不起作用。重建一切可能会,但这需要几个小时。
        【解决方案5】:
           > However, the code library has many hundreds of DLLs,
        

        如果您认为所有源项目及其生成的 dll 具有相同的版本号,您可以将版本号放入一个文件中,该文件在所有 dll 之间共享,如中所述 shared AssemblyInfo.cs。因此,如果有新的版本/版本,您(或您正在使用的版本号生成器)只需更新一个文件。

        这并不能回答您最初的问题,但可能是解决依赖问题的简单解决方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 2012-08-15
          • 1970-01-01
          相关资源
          最近更新 更多