今天在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的更多相关文章

  1. CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法

    今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net Framework Data Provider 可能没有安装. 下面找到官方的文档说明: SQLi ...

  2. plain framework 商业版 开发总结2 项目管理器

    任何事情都有三个阶段,分析.制作.质检的过程.在程序中就分为设计.编码.调试(测试)三个阶段,其中设计最为重要,设计的不好会导致编码和调试重复,甚至最后又回到了设计的过程.为了不会重复返工,所以设计的 ...

  3. 什么是目标框架别名(What are the Target Framework Monikers (TFMs))?

    我们现在的.NET Core 1.0应用(ASP.NET Core 1.0应用或控制台应用)有了新的被运行在不同框架上的可能性:①运行在.NET Core平台上 ②运行在传统的.NET Framewo ...

  4. Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.

    在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...

  5. Check .NET Version with Inno Setup

    原文 http://www.kynosarges.org/DotNetVersion.html Inno Setup by Jordan Russell is a great installation ...

  6. Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...

  7. .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上(ZT)

    本文转载   https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,感谢  吕毅 (包含链接: https://walte ...

  8. 控制台安装跟检测Microsoft.Net Framework

    1.检测 每一个版本的.Net Framework的安装过程都会在Windows目录下的\Microsoft.NET\Framework目录中生成一个子目录(安装目录). 比如说,假设Windows目 ...

  9. .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上

    转帖:https://blog.csdn.net/WPwalter/article/details/78067293 另参考:https://www.cnblogs.com/worksguo/arch ...

随机推荐

  1. Windows环境下npm install常见错误

    Windows环境下npm install安装包依赖时,常出现一些错误,下面为个人解决办法: 错误一 缺少python环境: G:\nodejs\moviesite\node_modules\bcry ...

  2. 访问者模式(Visitor Pattern)

    定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. Visitor 抽象访问者角色:为该对象结构中具体元素角色声明一个访问操作接口.该操作接口 ...

  3. 表单和 HTML 辅助方法– ASP.NET MVC 4 系列

           这里有一个疑问,诸如在文本编辑器中输入 HTML 元素如此简单的任务,也需要任何帮助吗?的确,输入标签名称是很容易的事,但是确保 HTML 页面链接中的 URL 指向正确的位置.表单元素 ...

  4. C#中dynamic的正确用法

    C#中dynamic的正确用法  http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...

  5. mybatis generator使用(基于maven)

    1.添加maven依赖 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId&g ...

  6. java关键字:synchronized

    JAVA 如何共享资源 关于synchronized函数: java具有内置机制,可防止某种资源(此处指的是对象的内存内容)冲突.由于你通常会将某class的数据元素声明为private,并且只经由其 ...

  7. Spring源码解析 - AntPathMatcher

    文章摘要: 1. ant匹配规则 2. PathMatcher接口 3. 通过测试用例看AntPathMatcher的使用 ant匹配规则 AntPathMatcher如名使用的ant 的匹配规则,我 ...

  8. spring.net xml 命名空间

    <objects    xmlns="http://www.springframework.net"    xmlns:xsi="http://www.w3.org ...

  9. ssh 发现了error while loading shared libraries这种错

    在Linux下运行程序时,发现了error while loading shared libraries这种错误,一时间不知道解决办法,在网上搜索,终于解决了: ./tests: error whil ...

  10. 获取与Url链接相关的信息

    以下结果的值以此示例为基础:http://www.x2y2.com:80/fisker/post/0703/window.location.html?ver=1.0&id=6#imhere j ...