2015-03-13 23 views
3

令我们惊讶的是,以下声明并不是抛出异常!为什么加载System.Data 4.0.99.99成功?

Assembly.Load("System.Data, Version=4.0.99.99, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

海关总署只包含版本4.0.0.0 - 没有4.0.99.99。请注意,试图加载4.1.0.0失败。我们只观察了.NET框架程序集的这种行为。

这是为什么?是否有适用于.NET框架程序集的默认程序集绑定重定向?还有其他的魔法吗?

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

+0

它肯定是这样。如果你为'AppDomain.CurrentDomain.AssemblyResolve'设置了一个事件处理程序,上面不会触发事件处理程序;但如果您更改汇编副版本(例如,转换为“4.1.99.99”)或公钥标记,则该事件将被触发。从那里我猜想版本号的最后两个重要部分被忽略。 – stakx 2015-03-13 16:38:20

+0

是否记录在案?我们只观察.NET框架程序集的这种行为。通常情况下,如果绑定重定向被定义,你会期望这种行为 - >是否有任何.NET框架程序集的默认绑定重定向? – 2015-03-13 16:39:06

+0

我没有检查,但也许'System.Data'版本4.0有一个[发布者策略文件](https://msdn.microsoft.com/en-us/library/7wd6ex19%28v=vs.110%29。 aspx#BKMK_Redirectingassemblyversions byusingpublisherpolicy),它执行重定向。 – stakx 2015-03-13 16:42:55

回答

2

正如Hans Passant在评论中提到的那样,CLR包含了一个用于框架程序集的重定向机制,可以将对旧框架库的引用重定向到新框架程序库。

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. 

在您的样本:您可以通过在融合日志看(使用fuslogvw.exe和配置它来记录所有绑定到磁盘),其中包含的信息“在架构配置中发现版本重定向”看到这一机制的工作,融合日志包含一个等效线:

LOG: Version redirect found in framework config: 4.0.99.99 redirected to 4.0.0.0. 

从这一点,我得出结论,相同的机制在这里发挥作用。似乎所有对System.Data的引用都被重定向到4.0.0.0。

(对于从4.1.0.0开始的版本,重定向不再起作用。)

+0

我也试着在CoreCLR中定位这个机制。具体的日志消息被定义为'ID_FUSLOG_FX_CFG_VER_REDIRECT',但我看不到这个消息实际发布在哪里(https://github.com/dotnet/coreclr/search?utf8=%E2%9C%93&q=ID_FUSLOG_FX_CFG_VER_REDIRECT)。 – 2015-03-16 08:55:12

+1

如果有人想深入研究,https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/inc/fxretarget.h似乎是一个很好的开始。 (在https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/binder/compatibility.cpp中也有一个遗留机制;但是这似乎不会影响'System.Data'。) – 2015-03-16 08:56:10

+0

请保持考虑到CoreCLR来源对于预测桌面CLR版本的外观是不可靠的。桌面版本更精细,没有超过SSCLI20的可用资源。重新定向是在稍后添加的。 – 2015-03-16 11:34:17