为什么加载System.Data 4.0.99.99成功?

时间:2015-03-13 16:29:31

标签: c# .net .net-assembly

令我们惊讶的是,以下声明不会抛出异常!

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框架程序集的默认程序集绑定重定向?还有其他魔法吗?

据我所知,只有找到完全相同的版本才能加载强名称的程序集。

1 个答案:

答案 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开始的版本,重新定位不再开始。)

相关问题