.NET类型转移

我们大家都知道,一般框架都能够实现向下兼容,那具体这个兼容是怎么实现的呢?

首先我们使用.Net Framework 3.5 创建一个控制台程序, 代码如下:

static void Main(string[] args)
        {
            Console.WriteLine(typeof(string).Assembly.FullName);
            Console.WriteLine(typeof(Func<>).Assembly.FullName);

            Console.ReadKey();
        }

这段代码输出了string类型和Func类型的所在程序集的信息,输出结果如下:

可以看到string类型所在程序集是mscorlib,版本是2.0;Func类型所在程序集是System.Core,版本是3.5。

我们使用.Net 3.5编译的,按道理来说mscorlib的版本应该也是3.5,为什么是2.0呢?

因为.Net Framework 2.0、3.0、3.5的运行时(CLR)都是2.0,.Net Framework从2.0升级到3.5时,核心类库mscorlib并没有升级,还是使用的2.0版本的mscorlib。而Func类型是在3.5版本引入的,放在程序集System.Core中。

上面的输出是在CLR为2.0时的输出结果,那如果我把程序的CLR改为4.0,结果会是怎么样呢?

新建一个APP.config配置文件(如果已存在则无需新建),修改配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

通过设置supportedRuntime的version=4.0,把当前程序的运行时设置为4.0。再看一下输出的结果:

这两个类型的程序集都变成了mscorlib,版本都变成了4.0。为什么会这样呢?

因为.NET在查找程序集时是根据当前运行时来查找的,而不是根据当前.NET Framework的版本来查找的。

但是还有一个问题,Func类型确实是定义在System.Core程序集中的,为什么当把运行时设置为4.0时,它所在的程序集就变成了mscorlib了呢?至于怎么看Func类型定义在哪个程序集中,我们转到Func类型的定义,看最上面的程序集信息即可知道。

我们找到.Net Framework 4.0下面的System.Core.dll程序集,这个程序集在我的电脑上的路径是:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0。打开ildasm.exe,这是一个.NET自带的反编译工具软件,在我电脑上的路径是:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools。

使用这个软件打开4.0版本下的System.Core.dll,双击MANIFEST,搜索System.Func,可以看到如下代码:

.class extern forwarder System.Func`1
{
  .assembly extern mscorlib
}

这个代码的意思是,当你要查找System.Func类型时,要转到mscorlib程序集中去查找。这就相当于是做了一个重定向,所以当获取它的程序集时,先去System.Core程序集中查找,然后转到mscorlib程序集中。

这里补充一下,.Net Framework 4.x的运行时都是CLR4.0。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值