我一直在寻找答案,但到目前为止我还没有。对于那些不熟悉我的问题基础的人,这里有一些解释。
在命名程序集时,您可以在.NET中使用两种类型的程序集:
强名称大会
简单命名的程序集(又名弱名命程序集,由Jeffrey Richter在其CLR中通过C#书创造)。
与简单命名的程序集不同,强名称程序集使用公钥/私钥进行签名。与我的问题相关,签署程序集的好处之一如下:
现在,程序集的版本号变得很重要。大会 包含对其使用类型的其他程序集的静态引用。当他们引用一个强名命的集会时,你必须给他们 具有确切签名的相同精确装配(名称,版本, 文化和公钥令牌)。否则,融合装配装载机 将无法解决它。
此外,强名称程序集只能引用其他强名称程序集,但不能引用简单命名的程序集。
根据我所描述的内容,我还希望将相同的规则应用于引用.NET Framework程序集。这意味着我的程序集将搜索.NET Framework附带的引用程序集的确切版本,我最初使用的是我编译的应用程序中的程序集。但是,当您从.NET 4.5升级到4.7而不重新编译应用程序时,您的应用程序仍在工作并且应该正常工作。这怎么可能?微软如何管理它?他们是否在融合加载器中对其程序集应用异常,以便它始终为用户开发的应用程序加载最新的.NET Framework程序集?它是否在内部为每个可能的旧版本使用bindingRedirect
到新版本?他们使用发布者政策吗?
我觉得答案隐藏在本文中:
运行时使用以下步骤来解析程序集引用:
通过检查适用的方法确定正确的装配版本 配置文件,包括应用程序配置文件, 发布者策略文件和计算机配置文件。如果 配置文件位于远程机器上,运行时必须 首先找到并下载应用程序配置文件。
- 醇>
... - Microsoft Doc
对于某些人来说,有一个关于Specific Version = true
标志的误解,可以在引用程序集时在Visual Studio中更改。此标志仅用于编译时检查,与运行时程序集解析无关。实际上,程序集仍然具有强名称,包括程序集名称,版本和公钥令牌(如果存在)。
微软说。这让我有点困惑。这是否意味着版本号对于弱命名和强命名的程序集都很重要?例如,如果我删除一个带有递增版本号的弱命名程序集,那么它是否会被引用其旧版本的其他程序集解析?默认情况下,运行时尝试使用的确切版本进行绑定 应用程序构建的程序集。