在编译的.NET程序集中更改程序集版本

简单的问题…有没有办法改变编译的.NET程序集的程序集版本?

我实际上没有更改程序集文件版本的方法。

你可以使用ILMerge :

  ILMerge.exe Foo.dll /ver:1.2.3.4 /out:Foo2.dll 

这样做的一个合理的原因是在构build中增加程序集版本,你会发现重大的变化(例如使用NDepend)。 这样,如果没有重大更改,程序集版本保持不变,并且可以轻松地修补已发布的版本。

我们总是增加文件版本,这反映了内部版本号。

你为什么要这样做? 如果是这样,另一个应用程序可以使用它,你可能想要看看程序集绑定redirect 。

老主题,但这里是我的5个angular钱…

  1. 拆卸

    ildasm my.exe /output:my.il / metadata

  2. 编辑my.il来更改版本信息。 有几个地方可以查看:

    • 重大:轻微:修订:build设 – 通常是一个事件
    • major.minor.revision.build – 多次发生。 该string在实际行后的注释部分中find。 版本是字节数组中的hex值。 例:

.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 35 2E 31 2E 33 2E 30 00 00 ) // ...5.1.3.0..

  1. 编辑my.res来更改版本信息。 双击并使用visual studio进行编辑。 非常简单的程序。

  2. 集合

    ilasm my.il /res:my.res

这听起来像你的过程是沉重的,因为你必须更新多个AssemblyInfo文件。 你有没有考虑在项目之间共享相同的AssemblyInfo文件? Derik Whittaker举了一个很好的例子来说明如何做到这一点。

一旦你有一个单一的文件,你可以通过使用MSBuild或NAnt更新您的单一AssemblyInfo版本,然后去额外的距离。

如果你有正式的testing和源代码控制,这个过程变得相当简单。 首先了解谁可以更改版本的不同数字段以及何时更改。 .net程序集有4个数字段(即1.0.0.1)。

第一个段包含主版本号。 这是由高层pipe理人员设置的,并指出了用户界面或应用程序平台中的重大变化。 程序集版本和文件版本之间始终应该是相同的数字。

第二个段包含副版本号,也称为function版本号。 这是由项目pipe理设置,并指出新function已被添加到应用程序。 程序集版本和文件版本之间始终应该是相同的数字。

第三部分包含Build号码。 这是由testing组设置的,并表示应用程序已准备好部署。 错误修复发布之前,它被更改。 当释放一个新的版本时,testing将第四个段重置为0.这可以是程序集版本和文件版本之间的相同数字,但对于程序集版本,通常保持为0,以简化修补现有的部署。

第四部分包含版本号。 这是由开发组每当将新代码检入源代码控制时设置的。 此编号将包含在编译的DLL的文件版本中,但不包含在程序集版本中。

我发现这有助于部署人员,testing人员和开发人员跟踪最新版本,而不必踩在彼此的脚趾上。 Unfortunatley,我也和那些使用静态版本控制系统的公司合作过,所以没有人真正知道最新的,最好的程序集。

在这个答案中引用的VerPatch是简单而有效的。