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
作者:易幾師
轉載請保留
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/162966.html
標籤:.NET技术
