如何检查装配是否已更改

Roh*_*est 3 .net c#

是否可以判断装配是否已更改?

我有一个标准项目,生成一个名为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));
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

罗汉

abd*_*sco 8

每个程序集都有一个ModuleVersionId像哈希一样工作的 GUID。如果更改单个字符,模块 ID 就会更改,但如果恢复它,则会恢复旧的 ID。它对于比较程序集的两个版本非常有用。

var assembly = Assembly.GetEntryAssembly();
var hashId = assembly.ManifestModule.ModuleVersionId;
Console.WriteLine(hashId);
Run Code Online (Sandbox Code Playgroud)
40744db8-a8fe-4591-9b2c-d9e3e04a2f0a
Run Code Online (Sandbox Code Playgroud)

https://learn.microsoft.com/en-us/dotnet/api/system.reflection.module.moduleversionid?view=net-5.0


JMa*_*sch 5

您可能需要使用版本号属性。哈希将不起作用,因为任何时候您重新编译一个程序集,它都会有所不同-即使代码根本没有更改。原因是每次编译时,编译器都会将guid嵌入程序集中,并将相同的guid放入相应的.pdb文件中。每次编译程序集时,guid都会更改。

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