.NET Framework 的 Quirk Version
今天在CSDN上看到一个帖子 :".net 4.0和4.5不同版本的Uri.ToString行为不同?", 调试.NET Framework 源代码发现,是这句代码起的作用
internal static bool ShouldUseLegacyV2Quirks
{
get
{
return UriParser.s_QuirksVersion <= UriParser.UriQuirksVersion.V2;
}
}
那这个s_QuirksVersion又是怎么来的呢,查找源代码,发现在静态构造函数中,有这样一句
UriParser.s_QuirksVersion = (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5 ? UriParser.UriQuirksVersion.V3 : UriParser.UriQuirksVersion.V2);
原来运行时判断了程序使用的.NET Framework版本!
那它又是怎么得到版本信息的呢?
其实是因为编译时会将这样一段信息加入执行文件中
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
当.NET Framework需要决定使用何种Quirk Version时,会读取目标程序的TargetFrameworkAttribute,得到它编译时针对 .NET Framework 的版本。
Assembly entryAssembly = Assembly.GetEntryAssembly();
TargetFrameworkAttribute[] array = (TargetFrameworkAttribute[])entryAssembly.GetCustomAttributes(typeof(TargetFrameworkAttribute), false);
Console.WriteLine(array[].FrameworkName);
我想这样做的原因可能是为了保证升级.NET Framework版本后,旧程序还能按原有方式运行,而不会被新的行为影响。
有兴趣的朋友可以将下列代码在不同.NET Framework框架下运行看看。
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>() { , , };
list.ForEach(i =>
{
Console.WriteLine(i);
if (i < ) { list.Add(i + ); }
}); Console.ReadLine();
}
}
.NET Framework 的 Quirk Version的更多相关文章
- CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法
今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net Framework Data Provider 可能没有安装. 下面找到官方的文档说明: SQLi ...
- plain framework 商业版 开发总结2 项目管理器
任何事情都有三个阶段,分析.制作.质检的过程.在程序中就分为设计.编码.调试(测试)三个阶段,其中设计最为重要,设计的不好会导致编码和调试重复,甚至最后又回到了设计的过程.为了不会重复返工,所以设计的 ...
- 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?
我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...
- Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.
在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...
- Check .NET Version with Inno Setup
原文 http://www.kynosarges.org/DotNetVersion.html Inno Setup by Jordan Russell is a great installation ...
- Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...
- .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上(ZT)
本文转载 https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,感谢 吕毅 (包含链接: https://walte ...
- 控制台安装跟检测Microsoft.Net Framework
1.检测 每一个版本的.Net Framework的安装过程都会在Windows目录下的\Microsoft.NET\Framework目录中生成一个子目录(安装目录). 比如说,假设Windows目 ...
- .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
转帖:https://blog.csdn.net/WPwalter/article/details/78067293 另参考:https://www.cnblogs.com/worksguo/arch ...
随机推荐
- ueditor调用其中的附件上传功能
ueditor实际上是集成了webuploader, 在做内容发布的时候想既有ueditor又有单独的附件上传按钮,这时再加载一个webuploader就显得过于臃肿了,单独利用ueditor的上传功 ...
- zend studio 配置 apache服务器事宜
安装好 zend studio后,配置 apache服务器时,设置 configuration directory时,需选中 xampp\apache里面的 conf 文件夹,即完整的路径为: *\x ...
- Centos7 修改ssh 默认端口号
第一步.修改/etc/ssh/sshd_config #Port 22 //这行去掉#号 Port 3600 //将端口号改成3600 第二步:在使用SELinux的系统中,需要修改SELinux 使 ...
- [Linux] - CentOS IP设置方法
CentOS 7的IP设置方法: 1.手动设置IP方法 a) 运行命令,cd到目录: cd /etc/sysconfig/network-scripts/ b) 运行命令:ls -l 找到类似这个文件 ...
- Python入门5
装饰器 装饰器英文Decorator,自身是一个函数,用来包装其它的函数,实现在不改变原来代码的情况下,增加新的功能,返回一个修改后的函数对象, 装饰器功能: 1.装饰器也是函数 2.在不改变原有代码 ...
- tcpdump抓SQL[转]
转自:http://www.cnblogs.com/LMySQL/p/5060604.html 前言:假设如果有个服务器几十个链接突然达到上千个链接,show processlist,general_ ...
- Python xlrd、xlwt、xlutils修改Excel文件
一.xlrd读取excel 这里介绍一个不错的包xlrs,可以工作在任何平台.这也就意味着你可以在Linux下读取Excel文件.首先,打开workbook: import xlrdwb = x ...
- Python的第三天
一.字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: ...
- Javascript 技巧集(1)
1. 数组克隆, 使用 slice() 方法 var a1 = [1,2,3,4]; var a2 = a1.slice(); 2. 强制将变量值转化为 bool 类型,前置双感叹号 !! var a ...
- mfc 控件字体设置
将以下代码加入至 OnInitDialog() 中 // TODO: Add extra initialization here CFont * m_font= new CFont; m_font-& ...