如果你對 .net core 做了任何重要的提交,你就需要為 .net framework 共享同樣的庫,因為,.net core 是一個新興的系統生態系統,仍然缺失很多部分。
在混合系統中,你有兩個選項來共享庫。首先,你可以開發一個 .net 標准庫,只要版本匹配,就可以直接共享。或者,你可以使用多目標方式對多於一個的平台進行交叉編譯。
通過 .NET Standard 方式共享
Microsoft 引入了 .NET Standard 以提供在微軟生態下的公共標准。它可以看作是可移植類庫 PCL 的后繼者,簡化了針對不同平台的業務。 在PCL 基於平台能力的配置中, .NET Standard 提供了精心選擇的 API 集。
結果就是你可以創建可以直接用於 .NET Framework 和 .net core 的庫(甚至包括 Xamarin )。你只需要確保 .NET Standard 庫的 Nuget 包添加到 .NET 應用中。
現在已經有半打的 .NET Standard 存在,所以並不能立即搞清楚目標版本,感覺走了 DLL 地獄,來了 .NET Standard 地獄。簡單來說,越高版本的 .NET Standard 就提供越多的 API 可用,而越低的版本支持的平台越多。
與任何 .net core 遷移過程一樣,你將是依賴項的囚徒,盡管適配 .NET Standard 的公共庫越來越多,對低於 1.3 的支持相當有限,從實踐的角度來說,你可以從 .NET Framework 4.6 開始。
許多開發者在產品中有混合的 .NET Framework 版本。這使得適配 .NET Standard 相當困難,特別是大型系統。你會驚訝於在黑暗的角落中有如此多的 .NET 4.0 甚至 .NET 3.5 代碼。盡管 4.5.2 仍然被微軟支持,但是它僅限於 .NET Standard 1.2.
多目標
對於無法保證特定版本的 .NET Framework 的混亂系統來說,多目標可以幫助擴大共享庫的范圍。這允許你編譯單個的本地相關,而對生成 .NET Standard 版本和你需要的 .NET Framework 版本。盡管代價是你需要管理多組的編譯輸出。
從 VS 2017 開始,這變得更加直接。
多版本的體驗並不一致,在 VS 2015 中,使用老式的基於 JSON 的 xproj 格式。可以為一個項目選擇多個框架,但是無法在 .NET Framework 項目中引用。需要采用一些非常困難的技巧:要么將項目遷移到 xproj 結構中,要么使用 NuGet 發布,兩種方式都不理想。
在新的版本中,這個問題已經得到了解決,但你仍然需要手動編輯項目文件以使其工作。在手工修改 framework 之后建議重新加載解決方案。
下面的示例展示了如何調整 TargetFramework 元素以使項目編譯到多於一個的 framework
<PropertyGroup> <TargetFrameworks>net452;netstandard1.3</TargetFrameworks> </PropertyGroup>
在編譯項目的時候,你將發到在 bin 文件夾中有兩個輸出,每個都是 framework 特定的。這使得你可以創建生成共享程序集的項目,針對 .NET Framework 4.5.2 或者任何 .NET Core 1.0
遷移現有庫
在規划共享庫的時候,應牢記 .NET Standard 是基於 .NET Framework 的一個子集。您已經習慣在 .NET Framework 中使用的許多 API 不是 .NET Standard 的一部分了。特別是被 .net core 重構的領域中。
將現有的 .NET Framework 庫實現為 .NET Standard 庫不可避免地需要遷移,類似於移植到 .net core 。微軟的 API 遷移工具可以告訴你這將需要涉及多少工作。這個命令行工具,ekyi為你提供導致兼容性問題的類型和成員的詳細信息。某些情況下,需要特定版本的 .NET Standard ,某些情況則不支持。
重復一下,最大的困難可能是外部的依賴庫。多目標方式僅僅可以用於,在項目的所有依賴支持你的目標框架的時候。某些差異可以通過條件編譯進行平滑處理,但是,.NET Standard 的主要意圖之一就是消除此類變通的方法。
很快...... 統一和兼容墊片
共享代碼的所有問題將由 .NET Standard 2.0 標准更為容易處理。該版本允諾將提供單個 API 集合,支持跨 .NET Core 2.0、.NET Framework 4.6.1 和 Xamarin。承諾提供一個兼容性的墊片,將支持 .NET Framework 程序集直接用於 .NET Standard 庫。例外是對不受 .NET Standard 支持的 API 的舊的 framework 版本或者程序集,是行不通的。
盡管有這樣的限制,微軟認為,在 Nuget 中超過 60% 的常用 .net framework 包可以通過墊片兼容 .NET Standard。這使得遺留的 .net framework 庫將可以通過 .net standard 兼容。
永遠不能共享的部分
盡管 .NET Standard 2.0 承諾的標准日益增強,但是仍然有一些領域永遠不會成為 .net core 的一部分。作為 Windows 通用應用的新 UI 原則, Windows Form 和 WPF 將永遠保留在 .net framework 中,任何平台特定的內容將被排除在外。例如,你不能使用 .net core 構建 Windows 服務,或者平台特定的進程管理器,例如 windows 中的 NSSM 或者 Linux 中的超級用戶。
WCF 的命運有點含糊,仍然有一個團隊在開發,但是看起來並不重要。對於在 WCF 中進行了大量投資的人來說不是好消息。這可能會造成體系的屏障,將比一對 .net framework 依賴更難解決。
原文地址
http://www.ben-morris.com/sharing-libraries-between-net-core-and-net-framework-applications/