注意到每次编译完之后,你的 dll 或者 exe 是不一样的吗?本来这并没有什么大不了的,但大家都知道数字和鹅厂的安全软件遍布在我们大(tiān)陆(cháo)地区的大量电脑上,它们的查杀策略是——凡是不认识的一律是病毒木马;于是每次不一样的编译很容易引起它们的警告——真不想每次都把编译后的样本提交给它们存档入库。


 

确定性编译

于是有一天意外地发现了 Roslyn 的确定性构建。

方法是在 csproj 文件中加入 <Deterministic/> 标记。

<Project>
<PropertyGroup>
<Deterministic>true</Deterministic>
</PropertyGroup>
</Project>

然后重新生成 dll 或 exe,多生成几次(每次都重新生成),会发现每次验证文件的 Hash 值都是一样的。

但是,一旦我们去掉这个标记,再验证 Hash 值,就开始改变了,而且每次都不一样。

不确定的编译

是什么导致了没有加此标记时每次编译都不一样呢?最少有三个:

  • MVID:当初微软在制定 CLI 标准时就说每次编译都应该在 PE 头生成新的 Id(很多工具都直接使用了 guid)
  • PDB ID:一个跟新生成的 PDB 文件匹配的 GUID 标识符
  • 时间戳:每次编译都要把当前时间加上

当然,如果你的版本号使用了 1.0.* 这样的动态版本号,那么每次编译还会新增一个构建号。


参考资料

最新文章

  1. 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
  2. WPFUIElement的Background的问题
  3. js初学—实现checkbox全选功能
  4. Android开发:第五日番外——过时的函数和被横杠的函数
  5. Java中同步
  6. rsync的断点续传设置。
  7. Log4J配置文件说明
  8. VBS学习:流程控制语句判断结构
  9. AutoCAD DxfCode组码值说明
  10. Scala官方作弊条
  11. 【转】文件读写NDK(或Linux)
  12. rsync常用参数详解
  13. [jquery备忘]
  14. WebForm 生成并显示二维码
  15. windows下用cmd命令netstat查看系统端口使用情况
  16. spring-boot的spring-cache中的扩展redis缓存的ttl和key名
  17. [转] 多核CPU 查看进程分配的CPU具体核id
  18. 11.17 luffycity(7)完结
  19. 删除排序数组中的重复项的golang实现
  20. BugPhobia开发篇章:Beta阶段第IX次Scrum Meeting

热门文章

  1. 锁(1)-- java锁
  2. RabbitMQ 之消息确认机制(事务+Confirm)
  3. Learning R笔记(一)
  4. DataTable 操作
  5. vim 的寄存器
  6. shell数组中“和@的妙用
  7. 【hive】关于浮点数比较的问题
  8. 简单粗暴地理解js原型链–js面向对象编程
  9. 023——VUE中数据排序sort() / 数据反转 reverse() 的使用
  10. Java进阶2 数组内存和对象的内存管理知识