从属程序集的版本是否存储在引用程序集中

本文关键字:程序集 引用 程序 存储 集中 是否 版本 | 更新日期: 2023-09-27 18:08:48

下面这段话摘自MSDN的这篇文章

…强名称签名使服务变得更加复杂。下当前版本控制策略时,程序集将始终尝试加载和建造它的组件完全一样。例如,您的应用程序是基于强命名的1.0.0.0版本构建的程序集,然后修复程序集中的错误,从而更改版本号到1.0.0.1,现有的应用程序将找不到更新组装。

现在,假设存在两个强命名程序集(用c#或VB.net编写),即X和Y,并且X依赖于Y。

    在编译时,Y的版本是否存储在X的某个地方?
  1. Y中使用的公钥是否存储在X中的某个地方以避免代码改变攻击?
  2. 如果CLR加载时检查了Y的版本,如果Y是动态加载的,没有编译时引用?
如果可能的话,请在答案中附上参考资料。

从属程序集的版本是否存储在引用程序集中

可以在编译时或运行时引用强命名程序集。

编译时间:

当您使用编译时引用时,编译器会自动获取目标强命名程序集的公钥,并将其置于正在编译的程序集的程序集引用。

因此它将存储在程序集清单中:

引用程序集的信息:其他程序集的列表由程序集静态引用的。每个引用包含从属程序集的名称,程序集元数据(版本,区域性、操作系统等)和公钥(如果是程序集)

运行时间:

在运行时引用强命名程序集(为例如,通过使用Assembly。装载或装配。GetType方法),你必须使用引用的强名称程序集的显示名称。的显示名的语法如下:

<assembly name>, <version number>, <culture>, <public key token>

显然你应该在运行时手动指定版本。

参见如何:引用强命名程序集

在编译时,Y的版本是否存储在X的某个地方?

是的,每个程序集都包含一个"清单",它记录了自己的身份和引用的身份。

2 Y中使用的公钥是否存储在X中的某个地方以避免代码更改攻击?

是的

如果在CLR加载时检查Y的版本,如果Y是动态加载且没有编译时引用会发生什么?

通常不检查,但请参阅AssemblyName