在每个文件的Manifest中可以看到哈希值?

时间:2012-03-03 09:53:34

标签: .net hash assemblies clr

这是杰弗里里希特的CLR通过C#书引用的一句话:

“当你构建一个强命名的程序集时,程序集就是 FileDef清单元数据表包括组成程序集的所有文件的列表。 当每个文件的名称被添加到清单时,文件的内容将被散列,并且此哈希值 value与FileDef表中的文件名一起存储。“

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

当我打开清单时,我找不到它的样本组件。我只在.assembly ConsoleTests {...}

下看到装配信息

1 个答案:

答案 0 :(得分:2)

通过组成程序集的所有文件,作者意味着netmodule,而不是引用的程序集。

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

(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)用密钥对主模块进行签名:

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

(4)在main-signed.dll中打开ildasm,然后双击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$.