当前位置:网站首页>.NET类型转移
.NET类型转移
2022-04-23 05:56:00 【begeneral】
我们大家都知道,一般框架都能够实现向下兼容,那具体这个兼容是怎么实现的呢?
首先我们使用.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。
版权声明
本文为[begeneral]所创,转载请带上原文链接,感谢
https://blog.csdn.net/niechaoya/article/details/106992736
边栏推荐
猜你喜欢
随机推荐
【正河源刀具相关】
JS实现私有属性
Overview of node file system and buffer
提交本地仓库并同步码云仓库
各进制数之间的互相转换
VHDL finite state machine (FSM) code example
.Net Core 下使用 Quartz —— 【7】作业和触发器之简单触发器
Palindromic Primes
SiteServer CMS5.0使用总结
1-4 NodeJS的安装之配置可执行脚本
useCenterHook
C# webpai 路由详解
微信小程序之点击取消,返回上页,修改上页的参数值,let pages=getCurrentPages() let prevPage=pages[pages.length - 2] // 上一页的数据
Wildcards and special symbols for shell scripts
Header内置对象
监听除某元素之外点击事件
ASP.NET CORE配置选项(下篇)
ASP.NET CORE3.1 Identity注册用户后登录失败的解决方案
查漏补缺(六)
邮箱字符串判断









