如何检查程序集是否已更改
如何检查程序集是否已更改
有可能判断一个程序集是否发生了改变吗?
我有一个标准项目,生成了一个名为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)); } }
谢谢
Rohan
如何检查程序集是否发生更改
每个程序集都有一个ModuleVersionId
GUID,它起到类似哈希的作用。如果您更改了一个字符,模块ID会发生变化,但如果您恢复更改,则会得到旧的ID。它对比较两个版本的程序集非常有用。
下面是一段C#代码示例,用于获取程序集的ModuleVersionId
并打印输出:
var assembly = Assembly.GetEntryAssembly(); var hashId = assembly.ManifestModule.ModuleVersionId; Console.WriteLine(hashId);
输出结果示例:
40744db8-a8fe-4591-9b2c-d9e3e04a2f0a
您可以通过以下链接了解有关ModuleVersionId
的更多信息:
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.module.moduleversionid?view=net-5.0
为什么在使用Blazor WebAssembly时,即使我没有更改任何代码,这个GUID每次都会发生变化?
Blazor文件会被转换为C#代码(请查看obj
文件夹),其中可能包含一些非确定性的元数据注释(比如时间戳)。这可能解释了为什么它会不断变化。
我明白了。有没有解决这个问题的方法?我对此有点困惑:即使我重新构建并在代码上做出更改,Assembly.GetExecutingAssembly().GetHashCode().ToString()始终返回相同的哈希(在我的情况下是'335105251')。
GetHashCode是完全不同的概念。它与程序集内容或文件哈希无关。您需要读取assembly.ManifestModule.ModuleVersionId来获取程序集的哈希信息。
如何检查一个程序集是否已经改变
问题的出现原因:
当重新编译代码时,即使代码没有发生任何更改,重新编译也会生成一个新的哈希值。
解决方法:
1. 生成哈希值后,将其存储在一个文本文件中。
2. 下次重新编译时,将生成的哈希值与之前存储的哈希值进行比较。
代码示例(C#):
using System; using System.IO; using System.Security.Cryptography; public static class AssemblyHashChecker { public static string GetAssemblyHash(string assemblyPath) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(assemblyPath)) { byte[] hashValue = md5.ComputeHash(stream); return BitConverter.ToString(hashValue).Replace("-", ""); } } } public static void Main() { string assemblyPath = "path_to_your_assembly"; string hashFilePath = "path_to_your_hash_file"; string currentHash = GetAssemblyHash(assemblyPath); string storedHash = File.ReadAllText(hashFilePath); if (currentHash == storedHash) { Console.WriteLine("The assembly has not changed."); } else { Console.WriteLine("The assembly has changed."); } } }
请注意,上述代码中的"path_to_your_assembly"和"path_to_your_hash_file"需要替换为实际的文件路径。