令我们惊讶的是,以下声明不会抛出异常!
Assembly.Load("System.Data, Version=4.0.99.99, Culture=neutral, PublicKeyToken=b77a5c561934e089");
GAC仅包含版本4.0.0.0
- 没有4.0.99.99
。请注意,尝试加载4.1.0.0
失败。我们仅针对.NET框架程序集观察到此行为。
为什么会这样?是否有适用于.NET框架程序集的默认程序集绑定重定向?还有其他魔法吗?
据我所知,只有找到完全相同的版本才能加载强名称的程序集。
答案 0 :(得分:2)
正如Hans Passant在评论中提到的,CLR包含一个框架程序集的重定向机制,它将对旧框架库的引用重定向到新框架库。您可以通过查看Fusion日志(使用fuslogvw.exe
并将其配置为记录所有绑定到磁盘)来查看该机制,其中包含“在框架配置中找到的版本重定向”信息:
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Users\fabian.schmied\Desktop\Temp\ConsoleApplication3\ConsoleApplication3\bin\Debug\ConsoleApplication3.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Version redirect found in framework config: 2.0.0.0 redirected to 4.0.0.0.
LOG: Post-policy reference: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
LOG: Found assembly by looking in the GAC.
在您的示例中,Fusion日志包含等效行:
LOG: Version redirect found in framework config: 4.0.99.99 redirected to 4.0.0.0.
由此,我得出结论,同样的机制在这里发挥作用。似乎所有对System.Data
到4.0.65534.65534的引用都被重定向到4.0.0.0。
(对于从4.1.0.0开始的版本,重新定位不再开始。)