2016-12-31 132 views
4

我有一個small library,目前支持.NET 2.0 +。如何創建既針對.NET 2.0又針對.NET標準的庫?

我沒有使用後來的框架版本的任何功能,所以它會很好地保持2.0的支持,但我也想要瞄準.NET核心(或更準確地說,.NET標準)。

我想兩個框架添加到project.json

"frameworks": { 
    "net20": {}, 
    "netstandard1.6": { 
    "imports": "dnxcore50" 
    } 
} 

不過的NuGet包我的圖書館需要對.NET標準(System.ReflectionMicrosoft.AspNetCore.WebUtilities)運行不兼容.NET 2.0。

如何解決這個問題,而無需維護兩個幾乎完全分離的代碼幾乎相同的項目?

+0

問題是,如果您想要使用最低要求爲4.5.1/netstandard 1.3(= .NET Framework 4.6)的軟件包,您需要.NET Framework 2.0支持嗎?你想用傳統的ASP.NET 4嗎?如果沒有,如果依賴於ASP.NET Core,那麼沒有理由將目標設定爲低,因爲ASP.NET Core不會在低於4.5或4.5.1的任何值上運行 – Tseng

回答

4

如果您依賴Microsoft.AspNetCore.*包作爲絕對最低支持.NET標準是.NET 4.5,您不能。

.NET 4.5是包含.NET Core所基於的System.Runtime的第一個版本。但是當你仔細思考時,這也沒有意義。如果您在庫中需要對ASP.NET Core的支持。

如果您的庫應該運行ASP.NET Core和ASP.NET 4(即MVC 5,WebApi 2),那麼您將需要有條件地使用ASP.NET依賴項並使用#if預處理器指令。

"frameworks": { 
    "net20": { 
    "dependencies": { 
     "NameOf.AspNetLegacyPackage": "1.2.3" 
    } 
    }, 
    "netstandard1.3": { 
    "dependencies": { 
     "Microsoft.AspNetCore.WebUtilities" : "1.1.0" 
    }, 
    "imports": "dnxcore50" 
    } 
} 

我以前netstandard1.3因爲這是最小的Microsoft.AspNetCore.WebUtilities,但根據您的其他依賴你可能需要去更高或更低。

NameOf.AspNetLegacyPackage是包的名稱,其中包含與您需要的Microsoft.AspNetCore.WebUtilities相同的功能,但它適用於.NET Framework 2.0(如果有)。如果沒有,你必須刪除它並自己寫替代函數。

然後在你的代碼中使用

#if NETSTANDARD1_3 
    // Code or APIs which is only available in netstandard1.3/net4.6 
    // this includes the Microsoft.AspNetCore.WebUtillities 
#else 
    // Use code or API which runs under .NET Framework 2.0 
#endif 

另外,如果你要放棄.NET Framework 2.0的支持,去4.5.1,您可以繼續使用Microsoft.AspNetCore.WebUtillities(見NuGet page依賴關係)它在這兩個

"dependencies": { 
    "Microsoft.AspNetCore.WebUtilities" : "1.1.0" 
}, 
"frameworks": { 
    "net451": { 
    }, 
    "netstandard1.3": { 
    "imports": "dnxcore50" 
    } 
} 
1

你可以將你的代碼共享項目做到這一點,然後創建一個類庫,其面向.NET 2.0,而另一個目標NetStandard類庫項目。如果2.0或Netstandard中有其他平臺中沒有的東西,則可以使用編譯器指令爲每個平臺編寫兼容的代碼。

相關問題