1. 程式人生 > 實用技巧 >.NET Standard多目標框架類庫引用繼承和函式呼叫規則

.NET Standard多目標框架類庫引用繼承和函式呼叫規則

0 引言

最近準備把之前的公共類庫移植為多目標框架,就研究了一下.Net Standard多目標框架類庫的官方文件,且自己做了個格式,總算搞清楚了多目標框架類庫引用繼承和函式呼叫規則,為怕以往,在這裡分享留檔,以備不時之需。眾所周知,.NET類庫是向下相容的,比如Net4.5可以引用Net4.0類庫,Net4.6可以引用Net4.5類庫,不同框架的函式可以通過#if進行框架版本限定,但是不同框架特定的函式是如何繼承的,這裡通過實驗進行檢驗。

1 測試

1.1 修改專案檔案為多目標框架類庫

<PropertyGroup>
	<TargetFramework>netstandard1.0</
TargetFramework> </PropertyGroup>

修改為

<PropertyGroup>
	<TargetFrameworks>net40;net45</TargetFrameworks>
</PropertyGroup>

1.2 新增測試類

public class ProviderNetVersion
{
    #if NET40
    public static string GetNetVersion()
    {
        Console.WriteLine("NET40");
        return
"NET40"; } #endif #if NET45 public static string GetNetVersion() { Console.WriteLine("NET45"); return "NET45"; } #endif #if NET46 public static string GetNetVersion() { Console.WriteLine("NET46"); return "NET46"; } #endif }

1.3 建立Winform專案

分別建立Net4.0、Net4.5、Net4.6框架的三個WinForm程式呼叫公共類庫的ProviderNetVersion.GetNetVersion() 方法,檢視具體呼叫的是哪個目標框架的函式。

分別加入測試程式碼

Winform Net4.0

private void Form1_Load(object sender, EventArgs e)
{
    Text = $@"Winform版本:Net4.0,引用類庫版本:{ProviderNetVersion.GetNetVersion()}";
}

Winform Net4.5

private void Form1_Load(object sender, EventArgs e)
{
    Text = $@"Winform版本:Net4.5,引用類庫版本:{ProviderNetVersion.GetNetVersion()}";
}

Winform Net4.6

private void Form1_Load(object sender, EventArgs e)
{
    Text = $@"Winform版本:Net4.6,引用類庫版本:{ProviderNetVersion.GetNetVersion()}";
}

1.4 測試結果

2 結果分析

本例中只設置了<TargetFrameworks>net40;net45</TargetFrameworks> ,表示類庫只會生成net40和net45的dll檔案。

雖然定義了

#if NET46
public static string GetNetVersion()
{
    Console.WriteLine("NET46");
    return "NET46";
}
#endif

但由於沒有生成net46的dll檔案,所以定義的NET46版本的GetNetVersion函式不會出現在生成的dll裡。

Net4.6的Winform程式事實上是引用的NET45的類庫,NET45的類庫反編譯後的函式定義如下:

using System;
namespace Test{
    // Token: 0x02000034 RID: 52
    public class ProviderNetVersion
    {
        // Token: 0x06000205 RID: 517 RVA: 0x0000D194 File Offset: 0x0000B394
        public static string GetNetVersion()
        {
            Console.WriteLine("NET45");
            return "NET45";
        }
    }
}

所以就出現了前面的測試結果。

3 總結

測試結果顯示,如果程式框架與類庫框架一致,且包含特定版本的函式(通過#if指定),則使用同一版本的函式,如Winform Net4.0和Net4.5測試結果。

如果程式框架比類庫框架版本新,則使用類庫最新目標版本的函式,如Winform Net4.6測試結果。

這裡留個問題:如果把#if NET45定義的函式註釋掉,您認為測試結果會怎樣?或者會出現什麼錯誤?有疑問的可以留言,歡迎發郵箱[email protected]進行交流。

public class ProviderNetVersion
{
#if NET40
    public static string GetNetVersion()
    {
        Console.WriteLine("NET40");
        return "NET40";
    }
#endif
// #if NET45
//         public static string GetNetVersion()
//         {
//             Console.WriteLine("NET45");
//             return "NET45";
//         }
// #endif
#if NET46
    public static string GetNetVersion()
    {
        Console.WriteLine("NET46");
        return "NET46";
    }
#endif
}
附:

官方文件:https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

文章網址:https://www.cnblogs.com/easynetwork/p/13779531.html

作者:易幾師

轉載請保留