2017年9月24日 星期日

了解 .NET 標準類別庫 (.NET Standard) 的 Type Forwarding 運作情形(模擬演練)

在 .NET 標準類別庫 (.NET Standard Class Library) 裡面,使用到一個核心技術,那就是 Type Forwarding。
我們在這裡將會透過實際演練過程,讓您體驗出何謂 Type Forwarding。

準備專案

在這裡,建立一個 .NET Framework 類別庫,我們命名為:MyLibAssemblyA,這個類別庫內,僅有一個類別宣告,如下所示:
namespace TypeForward
{
    public class Foo
    {
    }
}
接著,我們建立一個 .NET Framework 可執行的專案,我們命名為:TypeForward,並且在這個專案內,使用加入參考功能,將類別庫 MyLibAssemblyA 加入到這專案內,這個可執行專案的程式碼如下:
using System;

namespace TypeForward
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo();
            Console.WriteLine(typeof(Foo).AssemblyQualifiedName);
            Console.WriteLine("Press any key for continuing...");
            Console.ReadKey();
        }
    }
}

第一次執行

此時,請設定可執行的 .NET Framework 專案,TypeForward,為預設起始專案,並且執行這個專案。
您會看到這個應用程式將會輸出如下的內容,我們從這個內容,可以看到,我們這裡使用的型別, Foo 是位於 MyLibAssemblyA 組件內。
TypeForward.Foo, MyLibAssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Press any key for continuing...

加入 Type Forwarding

我們準備要把 Foo 這個類別的宣告,搬移到另外一個組件 (Assembly) 中,所以,我們另外建立一個 .NET Framework 類別庫,我們命名為:MyLibAssemblyB,這個類別庫內,僅有一個類別宣告,如下所示:
namespace TypeForward
{
    public class Foo
    {

    }
}
接下來,我們回到 MyLibAssemblyA 專案內,將之前宣告 Foo 類別的 .cs 檔案,修改成為如下的程式碼。
在這裡,我們看到了,我們將類別 Foo 的宣告已經移除了 (此時,這個類別的宣告已經搬移到 MyLibAssemblyB 專案內。
並且,我們在 MyLibAssemblyA 專案內,使用屬性 (Attribute) TypeForwardedTo 來指定目的地型別 Type (Foo) 其他組件(MyLibAssemblyB)中。
最後,我們要在 MyLibAssemblyA 專案中,使用加入參考功能,將 MyLibAssemblyB 專案加入到其參考清單中。
現在,我們可以重新建置這個 MyLibAssemblyA 專案。
請不要去建置 .NET Framework 可執行的專案 TypeForward
using System.Runtime.CompilerServices;

[assembly: TypeForwardedTo(typeof(TypeForward.Foo))]
//namespace TypeForward
//{
//    public class Foo
//    {
//    }
//}

第二次執行 (使用 Type Forwarding)

現在,我們到 MyLibAssemblyA 專案目錄下的 TypeForward\MyLibAssemblyA\bin\Debug 內的兩個 .dll 與兩個 .pdb 檔案都複製下來。
+

接著,將剛剛複製下來的四個檔案,複製到 .NET Framework 可執行的專案 TypeForward 下的 TypeForward\TypeForward\bin\Debug 目錄中。
此時,請執行 TypeForward.exe 檔案,您就會看到底下輸出結果。
這個時候,我們將看到了,類別 Foo 已經從組件 MyLibAssemblyA 轉移到組件 MyLibAssemblyB 了。
TypeForward.Foo, MyLibAssemblyB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Press any key for continuing...

沒有留言:

張貼留言