简单的问题......有没有办法改变已编译的.NET程序集的汇编版本?
我实际上可以改变程序集文件版本。
答案 0 :(得分:41)
您可以使用ILMerge:
ILMerge.exe Foo.dll /ver:1.2.3.4 /out:Foo2.dll
执行此操作的正当理由是在构建中增加程序集版本,以查找重大更改(例如,使用NDepend)。这样,如果没有重大更改,程序集版本保持不变,您可以轻松修补已发布的版本。
我们总是递增文件版本,这反映了内部版本号。
答案 1 :(得分:12)
老话题,但这是我的5角钱......
拆卸
ildasm my.exe /output:my.il/ metadata
修改 my.il 以更改版本信息。 有几个地方需要研究:
.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..
修改 my.res 以更改版本信息。 双击并使用visual studio进行编辑。非常直接的程序。
汇编
ilasm my.il /res:my.res
答案 2 :(得分:8)
你为什么要这样做?如果它是其他应用程序可以使用它,您可能需要查看assembly binding redirection。
答案 3 :(得分:5)
听起来您的流程很重,因为您必须更新多个AssemblyInfo文件。您是否考虑过在项目之间共享相同的AssemblyInfo文件? Derik Whittaker为如何做到这一点提供了一个很好的例子。
答案 4 :(得分:4)
如果您有正式的测试和源代码控制,那么这个过程就变得非常简单了。首先要了解谁可以更改版本的不同数字段,以及何时更改。 .net程序集有4个数字段(即1.0.0.1)。
第一段包含主版本号。这是由上层管理人员设置的,表示用户界面或应用平台的重大变化。程序集版本和文件版本之间的数字应该始终相同。
第二段包含次要版本号,也称为功能版本号。这是由项目管理设置的,表示已将新功能添加到应用程序。程序集版本和文件版本之间的数字应该始终相同。
第三段包含内部版本号。这是由测试组设置的,表示应用程序已准备好部署。在发布错误修复之前更改它。在发布新版本时,测试会将第四个段重置为0.这可以是程序集版本与文件版本之间的相同数字,但通常会为0以便装配版本简化修补现有部署。
第四段包含修订号。这是由开发组在将新代码检入源代码控制时设置的。此编号将包含在已编译DLL的文件版本中,但不包含在汇编版本中。
我发现这有助于部署人员,测试人员和开发人员跟踪最新版本,而无需踩到彼此的脚趾。不幸的是,我还与那些使用静态版本控制系统的公司合作,这样就没有人真正知道最新,最好的装配是什么。
答案 5 :(得分:4)
答案 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;
}
}