【问题标题】:Can i specify the module version id (MVID) when building a .net assembly?我可以在构建 .net 程序集时指定模块版本 ID (MVID) 吗?
【发布时间】:2011-04-08 16:50:33
【问题描述】:

我们有一些共享程序集,每晚都会自动生成。如果没有对源代码进行任何更改,我希望程序集二进制文件与以前的版本完全相同。

但是,程序集之间似乎存在细微差别。

我已经做了一些努力来确定两个构建之间的差异。我使用ildasm 生成了一个 il 版本,并比较了生成的文本版本。唯一的区别(在 IL 中)是模块中的 MVID(随机 guid)。

一些谷歌搜索告诉我模块版本 ID 是由编译器生成的,因此可以确定构建源,即使其他一切都相同。

此 MVID 在相同代码的构建之间创建人工差异,并人工签入生成的程序集。

是否可以将 MVID 提供给 C# 编译器?

【问题讨论】:

  • 这不是唯一的区别,例如 PE32 标头有一个时间戳。当您决定签入二进制文件时,这个问题才真正开始。
  • @Hans:我同意签入二进制文件不是最佳做法。我问这个问题是因为我想知道为什么构建相同代码的二进制文件之间存在差异。
  • 你仍然对我的论点嗤之以鼻。那么如果 MVID 发生变化呢?文件无论如何都会更改。您认为完全相同的源代码应该生成完全相同的二进制文件的假设是不正确的。你不能让它正确,放弃所有希望。
  • @Hans:为什么完全相同的源不能产生相同的二进制文件?
  • 在我看来,如果使用相同的编译器、链接器……(包括选项),完全相同的源代码应该会产生相同的二进制文件。时间戳和 MVID(模块版本标识符)使事情变得更加复杂。如果时间戳被删除并且 MVID 将是二进制的 SHA2(假设 MVID 为 00),那会更方便。如果二进制文件 100% 相等,则不需要重新测试。现在,没有办法确定这是否属实。

标签: c# .net assemblies diff binary-reproducibility


【解决方案1】:

ECMA-335 标准规定:

MVID 是用于区分的 Guid 在相同的两个版本之间 模块

根据此描述,将 this 作为参数提供给 C# 编译器会破坏其目的,因为您可以为不同的构建传递相同的 MVID,所​​以我会说不。

我认为更简单的方法是仅在不一定每晚都发生变化时进行构建。

【讨论】:

  • +1 表示基于签入而不是“仅仅因为”进行构建的想法另一种方法是根本不用担心。
【解决方案2】:

我意识到这是一个 5 年前的问题,但我制作了一个 Fody 插件,允许您为程序集指定自定义 MVID(我自己的测试需要)

你可以通过nuget获取:

Install-Package Mvid.Fody

然后您可以像这样指定自定义 MVID:

[assembly: Mvid("your-guid-string-here")]

当程序集编译时,它会有一个带有您指定的 Guid 的 MVID。

更多信息在这里:https://github.com/hmemcpy/Mvid.Fody

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多