.net - 在每个文件的 list 中哪里可以看到哈希值?

标签 .net hash assemblies clr

这是 Jeffrey Richter 的《CLR via C#》一书的引文:

“当您构建强命名程序集时,程序集的 FileDef list 元数据表包括组成程序集的所有文件的列表。 当每个文件的名称添加到 list 中时,文件的内容将被散列,并且该散列 值与文件名一起存储在 FileDef 表中。”

问题: 您能否解释一下每个文件(我的理解是引用的程序集+资源)是否经过哈希处理,以及每个文件的哈希值是否存储在 MANIFEST 中,我在哪里/如何找到/查看 list 中的这些哈希值?

当我打开 list 时,我无法找到我拥有的示例程序集。我只在 . assembly ConsoleTests {...}

下看到程序集信息

最佳答案

对于组成程序集的所有文件,作者指的是 netmodule,而不是引用的程序集。

如果程序集仅包含其自己的单个文件,则 FileDef 表将为空。 如果您尝试构建由多个模块组成的程序集,您将能够在 list 中看到哈希值。试试这个:

(1) 创建三个源文件(三个模块):

// module1.cs
namespace MultiModuleAssembly
{
    public class Class1 { }
}

// module2.cs
namespace MultiModuleAssembly
{
    public class Class2 { }
}

// main.cs
namespace MultiModuleAssembly
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            Class2 c2 = new Class2();
        }
    }
}

(2) 将各个文件编译成.netmodule:

csc /t:module module1.cs
csc /t:module module2.cs
csc /t:module main.cs /addmodule:module1.netmodule /addmodule:module2.netmodule

(3) 使用 key 对主模块进行签名:

al main.netmodule /keyfile:key.snk /out:main-signed.dll

(4) 在ildasm中打开main-signed.dll,双击M A N I F E S T节点:

// Somewhere in the middle of the listing
.file main.netmodule
    .hash = (89 84 FB F2 BB 72 AA 13 44 76 A5 49 8F 13 99 3E   // .....r..Dv.I...>
             54 30 24 84 )                                     // T0$.

关于.net - 在每个文件的 list 中哪里可以看到哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545125/

相关文章:

python - 如何从 auth_user django python 中选择给定用户名和哈希密码的用户

php - MySQL SHA() 不起作用

c# - 无法加载 {myassembly} 导入的过程

assemblies - 是否有必要在 list 文件中更改 assemblyIdentity 的版本属性?

c# - 外部别名 'xxx' 未在/reference 选项中指定

hash - 是否存在可以保证哈希算法唯一的情况?

c# - 扩展方法之间的模糊方法调用

dll - 在生产环境中设置NSASS?

c# - Windows 服务不执行 OnStart()

c# - 哪个第 3 方契约(Contract)代码库最像 MS 的 .NET 4.0 库?