据我所知,来自相同源代码的程序集的重复构建会产生具有微小差异的二进制文件:http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html
- MVID:标识为编译器1生成的每个PE新生成的PE的GUID。
- PDB ID:标识PDB匹配PDB的GUID,PDB是在每个构建时新生成的。
- 日期/时间戳:自每个构建计算的纪元以来的秒数。
这对Assembly.Evidence意味着什么?重复构建之间是否一致(来自相同的源代码)?
特别是,Assembly.Evidence.OfType<Hash>
。如何计算哈希值?它取决于上面的变量吗?理想情况下,哈希将取决于程序集的其余部分,不包括变化的标识符。
很容易测试:
using System;
using System.Reflection;
using System.Security.Policy;
namespace PlayAreaCSCon
{
internal static class Program
{
static void Main(string[] args)
{
foreach(var b in (new Hash(Assembly.GetExecutingAssembly()).SHA1))
{
Console.Write("{0} ", b);
}
Console.WriteLine();
Console.WriteLine("Complete");
Console.ReadLine();
}
}
}
第一次运行:
142 101 89 23 98 132 149 74 68 183 142 168 97 165 177 25 31 209 15 108
Complete
做一个干净/构建,然后再次运行:
58 42 138 106 209 240 236 116 168 108 220 244 104 190 71 211 254 9 11 176
Complete
所以,不,Assembly.Evidence
(具体来说,任何涉及Hash
)在构建之间不一致。