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

时间:2008-12-29 17:29:25

标签: .net

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

我实际上可以改变程序集文件版本。

7 个答案:

答案 0 :(得分:41)

您可以使用ILMerge

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

执行此操作的正当理由是在构建中增加程序集版本,以查找重大更改(例如,使用NDepend)。这样,如果没有重大更改,程序集版本保持不变,您可以轻松修补已发布的版本。

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

答案 1 :(得分:12)

老话题,但这是我的5角钱......

  1. 拆卸

      

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

  2. 修改 my.il 以更改版本信息。 有几个地方需要研究:

    • major:minor:revision:build - 通常是一次出现
    • major.minor.revision.build - 多次出现。该字符串位于实际行之后的注释部分中。版本是字节数组中的十六进制值。例如:
  3. .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

答案 2 :(得分:8)

你为什么要这样做?如果它是其他应用程序可以使用它,您可能需要查看assembly binding redirection

答案 3 :(得分:5)

听起来您的流程很重,因为您必须更新多个AssemblyInfo文件。您是否考虑过在项目之间共享相同的AssemblyInfo文件? Derik Whittaker为如何做到这一点提供了一个很好的例子。

一旦你有一个文件,你可以通过让构建过程使用MSBuildNAnt更新你的单个AssemblyInfo版本来增加距离。

答案 4 :(得分:4)

如果您有正式的测试和源代码控制,那么这个过程就变得非常简单了。首先要了解谁可以更改版本的不同数字段,以及何时更改。 .net程序集有4个数字段(即1.0.0.1)。

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

第二段包含次要版本号,也称为功能版本号。这是由项目管理设置的,表示已将新功能添加到应用程序。程序集版本和文件版本之间的数字应该始终相同。

第三段包含内部版本号。这是由测试组设置的,表示应用程序已准备好部署。在发布错误修复之前更改它。在发布新版本时,测试会将第四个段重置为0.这可以是程序集版本与文件版本之间的相同数字,但通常会为0以便装配版本简化修补现有部署。

第四段包含修订号。这是由开发组在将新代码检入源代码控制时设置的。此编号将包含在已编译DLL的文件版本中,但不包含在汇编版本中。

我发现这有助于部署人员,测试人员和开发人员跟踪最新版本,而无需踩到彼此的脚趾。不幸的是,我还与那些使用静态版本控制系统的公司合作,这样就没有人真正知道最新,最好的装配是什么。

答案 5 :(得分:4)

VerPatch,在此answer中引用,简单有效。

答案 6 :(得分:0)

奇怪的人错过了Resource Hacker。它是专门为黑客文件资源而设计的。因此,它还可以帮助您编辑程序集信息,包括文件版本

using System;
using System.Windows.Forms;
using System.Diagnostics;

public class rh
{
    public static void Main()
    {
        Assembly_Changer("file_path.exe");
    }
    
    private static string rc()
    {
        string FileVersion = "6,8,0,1";
        return "1 VERSIONINFO"
        + "\n FILEVERSION " + FileVersion
        + "\n PRODUCTVERSION 0,0,0,0" 
        + "\n FILEOS 0x4"
        + "\n FILETYPE 0x1"
        + "\n {BLOCK \"StringFileInfo\"{BLOCK \"000004b0\"{}}BLOCK \"VarFileInfo\"{VALUE \"Translation\", 0x0000 0x04B0}}";
    }

    public static void Assembly_Changer(string exe)
    {
        System.IO.File.WriteAllText("details.rc", rc());
        process("reshacker.exe", "-open details.rc -save resources.res -action compile -log NUL");
        process("reshacker.exe", "-open \"" + exe + "\" -resource resources.res -save \"" + exe + "\" -action addoverwrite -mask \"Version info\"");
    }

    public static bool process(string filename, string args)
    {
        using (Process process = new Process())
        {
            process.StartInfo.FileName = filename;
            process.StartInfo.Arguments = args;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            process.Start();
            process.WaitForExit();
        }
        return true;
    }   
}