.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。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章