在构建 .net 程序集时,我能否指定模块版本 ID(MVID)?

5
我们有一些共享的程序集,每晚都会自动构建。当没有对源代码进行更改时,我希望程序集二进制文件与之前版本完全相同。
然而,这些程序集之间似乎存在一些细微差异。
我已经努力确定两个构建之间的差异。我使用ildasm生成了一个il版本,并比较了生成的文本版本。唯一的区别(在IL中)是模块中的MVID(随机GUID)。
一些谷歌搜索告诉我,编译器会生成模块版本ID,因此即使其他所有内容相同,也可以确定构建来源。
这个MVID在相同代码的不同构建之间创建了人工差异,并且在结果程序集的人工提交中进行了检查。
是否可以向C#编译器提供MVID?

4
不仅仅是这一点不同,例如PE32头部有一个时间戳。当您决定提交二进制文件时,这个问题就真正开始了。 - Hans Passant
2
@Hans:我同意检查二进制文件不是最佳实践。我问这个问题是因为我想知道为什么使用相同代码构建的二进制文件之间存在差异。 - oɔɯǝɹ
1
你完全没有理解我的观点。即使 MVID 改变了又怎样?文件本身也会发生改变。你假设完全相同的源代码应该生成完全相同的二进制文件,这是不正确的。你无法使它正确,放弃希望吧。 - Hans Passant
2
@Hans:为什么完全相同的源代码不会产生相同的二进制文件? - oɔɯǝɹ
2
在我看来,如果使用相同的编译器、链接器等(包括选项),那么完全相同的源代码应该产生相同的二进制文件。时间戳和MVID(模块版本标识符)使事情变得更加复杂。如果时间戳被删除并且MVID是二进制文件的SHA2(假设MVID为00),那么会更方便。如果二进制文件完全相同,则无需重新测试。现在,无法确定这是否为真。 - Ramon de Klein
显示剩余4条评论
2个回答

7

ECMA-335标准规定:

MVID是用于区分同一模块的两个版本的Guid。

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

我认为更简单的方法是仅在发生更改时构建,而不一定每晚都构建。


赞同基于代码提交进行构建的想法,而不是“随便构建”。另一种选择是根本不用担心它。 - NotMe

5

我知道这是一个五年前的问题,但是我制作了一个Fody插件,可以让您为程序集指定自定义MVID(需要用于我的测试)

您可以通过nuget获取它:

Install-Package Mvid.Fody

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

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

当汇编编译时,它将具有您指定的GUID的MVID。
更多信息请参见:https://github.com/hmemcpy/Mvid.Fody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接