如何在不重新编译的情况下更新C#DLL的文件版本号

本文关键字:情况下 更新 C#DLL 版本号 文件 编译 新编译 | 更新日期: 2023-09-27 18:27:42

我想知道如何设置现有二进制文件的版本号,而不必重新生成其源代码。

如何在不重新编译的情况下更新C#DLL的文件版本号

首先,我想说,我认为这样做可能是一个糟糕的想法。。。这可能被解释为欺诈。

话虽如此,请参阅如何在不使用c#编译的情况下更新dll的程序集版本?发布在MSDN上。Konrad表示,您可以"直接编辑文件以更改版本信息"(尽管他建议不要这样做)。

刚刚尝试过,我可以确认可以在文本编辑器中打开dll文件,并且可以编辑文件版本。文本版本信息位于文件的末尾。

我只能假设文件中的某个地方也隐藏着二进制文件版本,因为在更改文本版本后,Windows属性窗口将不再在"详细信息"选项卡上显示产品版本信息。我认为这是因为文本版本不再与隐藏的二进制版本匹配(只是猜测)。奇怪的是,dll在编辑后仍然有效,但我仍然建议不要这样做。

使用reshacker.exe可以完全替换dll中的versioninfo资源。(我用这个例子来设置matlab编译器工具箱发出的dlls的版本,这比试图弄清楚如何让mcc处理它要容易得多)。我只是对程序集尝试了同样的原理,它同样有效,版本信息正确地显示在资源管理器中,应用程序仍然有效。

您可以通过gui来完成,但以下是我如何从构建脚本中使用它。首先,确保您有一个由rc.exe发出的.res文件,其中包含您的完整VERSIONINFO资源(有关此类rc文件的外观示例,请参阅此处)。然后创建一个包含以下内容的ini文件:

[FILENAMES]
Exe=path/to/dll
SaveAs=path/to/dll
log=res.log
[COMMANDS]
-delete versioninfo, 1,
-addoverwrite path/to/dll/version.res, versioninfo, 1,

并运行

reshacker -script patho/to/script

它将用路径/to/dll/version.res中的信息替换路径/to/dll中的版本信息。检查res.log以查看是否有错误。