如何检查程序集是否已更改

7 浏览
0 Comments

如何检查程序集是否已更改

有可能判断一个程序集是否发生了改变吗?

我有一个标准项目,生成了一个名为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

0
0 Comments

如何检查程序集是否发生更改

每个程序集都有一个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来获取程序集的哈希信息。

0
0 Comments

如何检查一个程序集是否已经改变

问题的出现原因:

当重新编译代码时,即使代码没有发生任何更改,重新编译也会生成一个新的哈希值。

解决方法:

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"需要替换为实际的文件路径。

0
0 Comments

要检查程序集是否发生了变化,你可能需要使用版本号属性。散列值不适用于此,因为每次重新编译程序集时,它都会不同,即使代码完全没有改变。原因是每次编译时,编译器都会将一个全局唯一标识符(GUID)嵌入到程序集中,并将相同的GUID放入相应的.pdb文件中。每次编译程序集时,GUID都会发生变化。

这就是调试器如何将程序集与其正确版本的.pdb文件匹配的方式(这也是为什么您必须始终保存发布版本的.pdb文件,并且不能依赖于能够生成与现有程序集匹配的.pdb文件的原因)。

0