融合程序集加载程序如何决定加载哪个DLL版本

时间:2014-07-30 10:46:10

标签: .net gac fusion project-reference dll-reference

保持简单,假设本地文件夹中没有DLL,或涉及配置文件,或发布者策略或自定义解析。唯一引用DLL的地方是GAC。

Fusion如何决定GAC中哪个版本的DLL(所有其他条件相同),优先顺序是什么?

例如,如果在我的项目中,我引用了10.5.0.0版的DLL。它会选择版本10.5.0.0或10.5.1.0的DLL。或者,如果我在GAC中只有10.4.0.0版本,它会工作还是抛出错误?这些规则是否会根据主要/次要/构建/修订部分是否发生变化而改变?

如果项目参考“特定版本”设置为True或False,它有何不同?

如果引用是DLL引用或项目引用,那么它有何不同?

我猜这里有一个MSDN网站,说明这是如何工作的,但我似乎无法找到它。我不打算覆盖行为,我只是想知道默认行为是什么。

1 个答案:

答案 0 :(得分:1)

How the Runtime Locates Assemblies中的MSDN上有记录。特别是,只有在使用强名称加载程序集时才会搜索GAC。可能仍有适当的发布商政策"重定向"到另一个集会,但没有自动规则。

在我看来,GAC只是Microsoft应该用于.NET Framework的东西,你可以通过在不使用GAC的情况下分发应用程序或库来消除很多痛苦(当然除了.NET Framework)

引用程序集的特定版本是构建时属性,它不会影响运行时行为。但是,当程序集引用被编译为可执行文件时,版本将存储在可执行文件中,并在运行时加载特定版本(在应用程序集重定向规则之后)。

总而言之:为了让.NET加载所请求的程序集的另一个版本,必须有一个程序集重定向。您的应用程序可以在app.config文件中提供重定向,GAC可以具有发布者策略。