写客户端桌面程序,相信很多人都会碰到自动升级的问题,生成自动升级文件的时候需要对比文件的MD5码是否发生了改变,如果改变需要升级,如果没有改变则不需要升级。这次就说说关于MD5的生成。
最早的系统是用VS2010编译的,每次编译生成的MD5码都不一样,导致每次自动升级包都是全量升级,为了改变这种情况公司大神给出了解决方案,反编译DLL,然后自己对比反编译代码是否发生了改变,如果改变才会重新生成MD5,没有发生改变就不会重新生成MD5,这个对比逻辑还是比较麻烦的,其中也发现过一些问题,比如说,只改变属性或者只改变静态变量的赋值,这样的情况没有考虑到,没有对比逻辑,就会导致DLL改变了之后不会生成新的MD5,但是大体思路还是可行的,我们生产也应用了好久这样的方案。
之后,有一次偶然发现,在VS2019上编译,使用下面这段代码生成MD5,相同代码多次编译,每次MD5都是一样的,就不用之前那么复杂的对比逻辑。不同机器上还是会有不同。
oFileStream = new System.IO.FileStream(pathName, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
arrbytHashValue = oMD5Hasher.ComputeHash(oFileStream);
看来是微软对编译器做了升级,这次还测试了,相同的执行代码,在2010上每次执行的MD5码不一样,但是在2019上就是一样的。并且和FrameWork版本并不相关。