如何在Visual Studio中使自动版本号工作

时间:2011-05-09 12:43:22

标签: c# visual-studio

我被要求在代码库中为程序集添加自动编号。我一直在将版本从默认的1.0.0.0更改为1.0。*像这样:

[assembly: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是具有更高版本号的DLL,这是我们想要的那个。

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

5 个答案:

答案 0 :(得分:8)

使用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加载项非常棒。

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

构建版本增量加载项为您提供了一种细粒度的控制,可以对增加的内容进行细粒度控制。这可能应该包括在VS中。

答案 1 :(得分:3)

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

我还建议查看http://semver.org/并使用语义版本控制,如果您不想按照这样的系统(或为您的商店制定类似的标准),它甚至可能不值得尝试版本你的DLL你只会给自己带来巨大的麻烦。但是,使用语义版本控制将使您的版本号实际上意味着什么。而且不仅仅是感觉被标记到当前版本。

答案 2 :(得分:1)

请注意,修订号不是随机的。这是构建的时间。 Build是日期编号。

请参阅VisualStudio: translating a build version to a calendar date

答案 3 :(得分:0)

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

PS:如果您在添加引用时,选择浏览并指向dll将始终存在的位置,引用将不会被破坏!

答案 4 :(得分:0)

   > However, the code library has many hundreds of DLLs,

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

这不能回答您的原始问题,但可能是依赖问题的简单工作方法。