C# 按位比较.exe和.dll与包含的AssemlyInfo.cs

C# 按位比较.exe和.dll与包含的AssemlyInfo.cs,c#,dll,comparison,exe,assemblyinfo,C#,Dll,Comparison,Exe,Assemblyinfo,背景: 我被指控试图想出一种新方法来比较DLL和使用AssemblyInfo嵌入版本号的EXE。每次我们进行新的构建时,版本都会相应地增加。然而,当需要部署新版本时,我们只想复制实际已更改的DLL和EXE,但嵌入式版本号似乎总是这样 为了解决这个问题,系统目前只依赖于比较文件大小,但我的任务是注意到这似乎不够好,因为我们无法部署新的exe,尽管它发生了更改;它们恰好有相同的文件大小。我们不知道这种情况发生的频率,所以我们需要做点什么,但如果可能的话,我们希望在替换DLL和EXE时保持明智,这样用

背景:

我被指控试图想出一种新方法来比较DLL和使用AssemblyInfo嵌入版本号的EXE。每次我们进行新的构建时,版本都会相应地增加。然而,当需要部署新版本时,我们只想复制实际已更改的DLL和EXE,但嵌入式版本号似乎总是这样

为了解决这个问题,系统目前只依赖于比较文件大小,但我的任务是注意到这似乎不够好,因为我们无法部署新的exe,尽管它发生了更改;它们恰好有相同的文件大小。我们不知道这种情况发生的频率,所以我们需要做点什么,但如果可能的话,我们希望在替换DLL和EXE时保持明智,这样用户就不会在每次真正需要替换UI不使用的文件时被迫关闭UI

因此,我的问题是,是否有一种聪明的方法可以将EXE和DLL与使用AssemblyInfo的嵌入式版本进行比较,同时忽略元数据本身。我环顾四周的次数越多,这似乎就越不可能,但我认为在每次放弃并更换所有东西之前,还是值得一问的

谢谢你的帮助


编辑:我想我真正希望的一件事是对某些偏移量进行逐位比较。AssemblyInfo是否总是在特定点编译,例如作为可以在比较中说明的页眉或页脚?

不要更新所有文件中的版本号。而是只更新已更改的特定文件中的版本。这需要在构建过程中进行一些更改,但可以解决您的问题。

Eric Lippert:

是否两次编译同一个C#程序就能保证生成相同的二进制输出?
否。
嗯,那是一个很容易写的博客。

C#编译器的设计从来不会两次生成相同的二进制文件。每次运行C#编译器时,它都会在每个程序集中嵌入新生成的GUID,从而确保没有两个程序集是完全相同的


您将遇到一个障碍,因为.Net通常设置为使用版本号来确定某些内容是否不同。如果引用“特定版本”设置为false,您不应该打赌吗?嗯,这基本上解决了这个问题。从理论上看,挑选要比较的部分是可能的,但这是一个巨大的难题,非常令人沮丧,而且不能保证将来随着编译器的更改而工作。谢谢你!