c# - 为什么加载System.Data 4.0.99.99会成功?

标签 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 Framework 程序集是否有任何默认的程序集绑定(bind)重定向?还有其他魔法吗?

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

最佳答案

正如 Hans Passant 在评论中提到的那样,CLR 包含一种用于框架程序集的重定向机制,可将对旧框架库的引用重定向到较新的框架库。您可以通过查看 Fusion 日志(使用 fuslogvw.exe 并将其配置为记录所有绑定(bind)到磁盘)来了解该机制的工作情况,其中包含信息“在框架配置中找到的版本重定向”:

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.

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

(对于从 4.1.0.0 开始的版本,重定向不再启动。)

关于c# - 为什么加载System.Data 4.0.99.99会成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037336/

相关文章:

c# - 在运行时动态更改对 dll 的引用

c# - 您可以使用 POST 在 Solr (/select) 中运行查询吗

c# - 在 "long"间隔后完成可观察序列

c# - 如何在矩形中正确定位 "X"?

c# - 如何检测我的 .NET 程序集是从网站运行还是从桌面计算机运行?

.net - 如何在 WatiN 中滚动 Firefox 和 IE?

python - 从 python : sandbox, loadFromRemoteSources 运行 IronPython 脚本

c# - Web 应用程序无法启动 : iisexpress. exe 已退出,代码为 0

c# - 没有窗体的 ActiveX 控件

asp.net - Web 应用程序在本地工作,但在部署服务器上不工作