.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
作者:易幾師
轉載請保留