在 .NET 中,当 exe/dll 引用外部 dll 时,该信息如何编码到 exe/dll 中?什么时候检查dll的有效性?什么时候检查签名信息?
编辑:这是在运行时
从 Visual Studio 命令提示符运行ildasm.exe并打开任意 .NET exe 或 dll 文件。双击清单,例如,您将看到:
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
这告诉您,您正在查看的程序集依赖于另一个名为 mscorlib 的程序集。或者换句话说,程序集的元数据包含对它所依赖的所有 DLL 的引用。查看其他 .assembly 指令以查看其他依赖项,我选择了一个您总能找到的。
该.ver
条目很重要,它表示需要 mscorlib 的哪个 [AssemblyVersion]。在我的情况下,版本 2.0.0.0,在你的情况下可能是 4.0.0.0。用于该特定程序集的两个最常见的版本。自定义程序集一切皆有可能,[AssemblyVersion] 属性非常重要。
这.publickeytoken
是有效性检查的一部分,它有助于在运行时验证程序集的强名称。加载程序集并启用强名称验证时会发生这种情况。仅当从不受信任的位置检索程序集时才启用它。
每当需要编译使用在另一个程序集中定义的类型的代码时,抖动就会加载程序集。从上述 .assembly 参考中提供的信息中查找该程序集是 CLR 的工作。请注意该信息如何不存储文件的路径。CLR 定位该文件的方式本身就是一个漫长的故事,MSDN 库文章对此进行了很好的介绍。