zoukankan      html  css  js  c++  java
  • .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[0].FrameworkName);

    我想这样做的原因可能是为了保证升级.NET Framework版本后,旧程序还能按原有方式运行,而不会被新的行为影响。

    有兴趣的朋友可以将下列代码在不同.NET Framework框架下运行看看。

    class Program
        {
            static void Main(string[] args)
            {
                List<int> list = new List<int>() { 1, 2, 3 };
                list.ForEach(i =>
                {
                    Console.WriteLine(i);
                    if (i < 3) { list.Add(i + 1); }
                });
    
                Console.ReadLine();
            }
        }
  • 相关阅读:
    《SmartJs系列》屌丝逆袭,华丽转身,解读自定义ScrollBar(一)
    IE6/IE7下,li设置float后,行高变高问题__UL的padding-top Bug
    团队作业
    团队作业
    结对作业
    个人作业
    心得
    css3的自定义字体
    javascript中的call方法
    javascript对象访问
  • 原文地址:https://www.cnblogs.com/feiyun0112/p/3673306.html
Copyright © 2011-2022 走看看