【问题标题】:How do I update the file version number of C# DLL without recompiling?如何在不重新编译的情况下更新 C# DLL 的文件版本号?
【发布时间】:2013-08-14 12:04:21
【问题描述】:

我想知道如何设置现有二进制文件的版本号,而无需重新构建其源代码。

【问题讨论】:

  • 这些是托管 (.NET) dll 吗?如果它们是托管的 - 它们是否已签名?
  • 为什么要更改现有二进制文件的版本号?如果要更新二进制文件,只需将其替换为新版本即可。
  • 在某种程度上,我希望这是不可能的。
  • 我并不是说这是不可能的,因为它可能是某种黑客行为,但绝对不应该被允许。
  • reshacker.exe 为“正常”二进制文件执行此操作,不确定它是否也适用于程序集。

标签: c# wpf dll


【解决方案1】:

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

话虽如此,请参考 MSDN 上的How to update assembly version of a dll without compiling in c#? 帖子。根据 Konrad 的说法,您可以“直接编辑文件以更改版本信息”(尽管他不建议这样做)。

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

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

【讨论】:

  • 只是想知道(和 IANAL),但为什么这是非法/欺诈?
  • @pwny,可能是因为文件/dll 的特定版本可能具有与之相关的许可/合同义务和限制。通过更改文件的版本号,您可能会在合约和二进制文件之间创建脱节(合约适用于 DLL V1,但 DLL 被报告为具有不同义务的 V2)。我没有合法化,但这是我的看法。
  • 关于您的第一段:请参阅我在回答中使用它的原因。它没有任何问题,更不用说这是一个糟糕的主意。但是,我们当然不知道 OP 打算用它做什么:P
【解决方案2】:

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

您可以仅通过 gui 执行此操作,但这是我从构建脚本中使用它的方式。首先确保您有一个由rc.exe 发出的.res 文件,其中包含您的完整VERSIONINFO 资源(请参阅here 以了解此类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

它会将 path/to/dll 中的版本信息替换为 path/to/dll/version.res 中的信息。检查 res.log 看看是否有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2022-06-28
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多