是否可以判断装配是否已更改?
我有一个标准项目,它生成一个名为MyAssembly.dll的程序集。
在一个单独的项目中,我读取程序集并生成哈希。
当我为程序集生成哈希时,每次重新编译时它都是不同的。我已将程序集版本设置为静态,是否还需要更改其他任何属性?
class Program
{
static void Main(string[] args)
{
var array = File.ReadAllBytes(@"MyAssembly.dll");
SHA256Managed algo = new SHA256Managed();
var hash = algo.ComputeHash(array);
Console.WriteLine(Convert.ToBase64String(hash));
}
}
由于
罗汉
答案 0 :(得分:4)
您可能需要使用版本号属性。哈希不起作用,因为无论何时重新编译程序集,它都会有所不同 - 即使代码根本没有改变。原因是每次编译时,编译器都会在程序集中嵌入一个guid,并将相同的guid放入相应的.pdb文件中。每次编译程序集时,guid都会改变。
这是调试器将程序集与其.pdb文件的正确版本匹配的原因(这也是为什么你必须始终将.pdb保存在你发布的任何内容上的原因,并且你不能依赖于能够生成一个pdb来匹配现有的装配)
答案 1 :(得分:2)
您可以在生成后将哈希存储在文本文件中,然后在下次重新编译时对其进行检查。
答案 2 :(得分:1)
好吧,如果它是你自己管理的程序集,我会建议每次构建该程序集时添加一个版本号和auto-increase版本号。
然后你可以检查版本号。
答案 3 :(得分:0)
This project似乎通过在生成MVID
哈希之前反汇编每个文件并删除MD5
GUID以及其他一些位来实现这一目的。它依赖于ildasm.exe。
答案 4 :(得分:0)
目前,这确实不是一件小事-但是-我已经筹集了两张门票 .net平台本身,也适用于ilSpy-据我所知,它们是将来可以实现特定功能的最佳人选。
如果您想了解目前如何实施的替代方法,请参阅票证说明。
现在在此处提供两个链接:
答案 5 :(得分:0)
每个程序集都有一个 ModuleVersionId
GUID,其作用类似于散列。如果您更改单个字符,模块 id 会更改,但如果您还原它,则会返回旧的 id。这对于比较程序集的两个版本很有用。
var assembly = Assembly.GetEntryAssembly();
var hashId = assembly.ManifestModule.ModuleVersionId;
Console.WriteLine(hashId);
40744db8-a8fe-4591-9b2c-d9e3e04a2f0a
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.module.moduleversionid?view=net-5.0