如何使用旧的.NET Framework程序集编译.NET应用程序仍然能够解析较新的.NET Framework程序集

时间:2018-01-20 04:28:18

标签: c# .net .net-assembly

我一直在寻找答案,但到目前为止我还没有。对于那些不熟悉我的问题基础的人,这里有一些解释。

上下文

在命名程序集时,您可以在.NET中使用两种类型的程序集:

  1. 强名称大会

  2. 简单命名的程序集(又名弱名命程序集,由Jeffrey Richter在其CLR中通过C#书创造)。

  3. 与简单命名的程序集不同,强名称程序集使用公钥/私钥进行签名。与我的问题相关,签署程序集的好处之一如下:

    现在,程序集的版本号变得很重要。大会 包含对其使用类型的其他程序集的静态引用。当他们引用一个强名命的集会时,你必须给他们 具有确切签名的相同精确装配(名称,版本, 文化和公钥令牌)。否则,融合装配装载机 将无法解决它。

    此外,强名称程序集只能引用其他强名称程序集,但不能引用简单命名的程序集。

    问题

    根据我所描述的内容,我还希望将相同的规则应用于引用.NET Framework程序集。这意味着我的程序集将搜索.NET Framework附带的引用程序集的确切版本,我最初使用的是我编译的应用程序中的程序集。但是,当您从.NET 4.5升级到4.7而不重新编译应用程序时,您的应用程序仍在工作并且应该正常工作。这怎么可能?微软如何管理它?他们是否在融合加载器中对其程序集应用异常,以便它始终为用户开发的应用程序加载最新的.NET Framework程序集?它是否在内部为每个可能的旧版本使用bindingRedirect到新版本?他们使用发布者政策吗?

    我觉得答案隐藏在本文中:

      

    运行时使用以下步骤来解析程序集引用:

         
        
    1. 通过检查适用的方法确定正确的装配版本   配置文件,包括应用程序配置文件,   发布者策略文件和计算机配置文件。如果   配置文件位于远程机器上,运行时必须   首先找到并下载应用程序配置文件。

    2.   
    3. ... - Microsoft Doc

    4.   

    其他说明:

    特定版本

    对于某些人来说,有一个关于Specific Version = true标志的误解,可以在引用程序集时在Visual Studio中更改。此标志仅用于编译时检查,与运行时程序集解析无关。实际上,程序集仍然具有强名称,包括程序集名称,版本和公钥令牌(如果存在)。

    一个额外的快速问题:默认情况下?

      

    默认情况下,运行时尝试使用的确切版本进行绑定   应用程序构建的程序集。

    微软说。这让我有点困惑。这是否意味着版本号对于弱命名和强命名的程序集都很重要?例如,如果我删除一个带有递增版本号的弱命名程序集,那么它是否会被引用其旧版本的其他程序集解析?

0 个答案:

没有答案