这是杰弗里里希特的CLR通过C#书引用的一句话:
“当你构建一个强命名的程序集时,程序集就是 FileDef清单元数据表包括组成程序集的所有文件的列表。 当每个文件的名称被添加到清单时,文件的内容将被散列,并且此哈希值 value与FileDef表中的文件名一起存储。“
问题: 你能解释一下每个文件(我的理解是引用程序集+资源)是否经过哈希处理,以及每个文件的哈希值是否存储在MANIFEST中,我在哪里/如何在清单中查找/查看这些哈希值?
当我打开清单时,我找不到它的样本组件。我只在.assembly ConsoleTests {...}
下看到装配信息答案 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$.