更改已编译的程序集版本信息

本文关键字:程序集 版本 信息 编译 | 更新日期: 2023-09-27 18:21:45

我有一个exe和一堆dll,它们不是强命名的。

exe需要一个具有不同版本的dll的特定版本,因此在启动exe时会发生错误。

我没有这个dll的源代码来更改它的程序集版本,所以可以从外部更改这个dll的版本或它在exe中的引用吗?

我尝试过使用dll的"ILMerge.exe Foo.dll/ver:1.2.3.4/out:Foo2.dll",但生成的dll版本保持不变。

有什么想法吗?

谢谢,

更改已编译的程序集版本信息

使用Mono.Cecil可以轻松做到这一点(https://www.nuget.org/packages/Mono.Cecil/)使用Mono.Cecil打开程序集,查找AssemblyFileVersionAttribute并进行必要的更改,然后保存程序集(dll)并使用修改后的文件。

为了更新exe,你可以做一些非常类似的事情来更新依赖(程序集)dll的版本号。

请参阅以下内容(更新后包括更改程序集(dll)版本的代码示例以及exe中的元数据):

void Main(){
    UpdateDll();
    UpdateExe();
}
static void UpdateExe(){
    var exe = @"C:'temp'sample.exe";
    AssemblyDefinition ass = AssemblyDefinition.ReadAssembly(exe);
    var module = ass.Modules.First();
    var modAssVersion = module.AssemblyReferences.First(ar => ar.Name == "ClassLibrary1");
    module.AssemblyReferences.Remove(modAssVersion);
    modAssVersion.Version = new Version(4,0,3,0);
    module.AssemblyReferences.Add(modAssVersion);
    ass.Write(exe);
}
static void UpdateDll()
{
    String assemblyFile = @"C:'temp'assemblyName.dll";
    AssemblyDefinition modifiedAss = AssemblyDefinition.ReadAssembly(assemblyFile);
    var fileVersionAttrib = modifiedAss.CustomAttributes.First(ca => ca.AttributeType.Name == "AssemblyFileVersionAttribute");
    var constArg = fileVersionAttrib.ConstructorArguments.First();
    constArg.Value.Dump();
    fileVersionAttrib.ConstructorArguments.RemoveAt(0);
    fileVersionAttrib.ConstructorArguments.Add(new CustomAttributeArgument(modifiedAss.MainModule.Import(typeof(String)), "4.0.3.0"));
    modifiedAss.Name.Version = new Version(4,0,3,0);
    modifiedAss.Write(assemblyFile);
}