让一个 csproj 项目指定多个开发框架
?
可移植類庫、共享項目、.NET Standard 項目都能夠幫我們完成跨多個 .NET SDK 的單一項目開發,但它們的跨 SDK 開發都有些限制。現在,我們又有新的方式能夠跨多個 .NET SDK 開發了,這就是使用新的 csproj 文件格式。
看看擁有多個開發框架的項目長什么樣吧!
▲ 多 SDK 項目
是不是很激動?
新 csproj 文件
在 如何組織一個同時面向 UWP/WPF/.Net Core 控制臺的 C# 項目解決方案 - walterlv 一文中我講了 .NET Standard 的方式,這種方式優勢非常明顯,跟普通的開發方式一樣,也是我最推薦的方式。但缺點是要求目標 SDK 支持對應的 .NET Standard 版本。
使用共享項目的方式則是直接共享了源碼,只要在目標項目中指定了條件編譯符,那么源碼便能針對各種不同的目標框架進行分別編譯。但缺點是對擴展插件的支持較差(可能是因為擴展插件難以判斷項目的真實開發框架),而且 Visual Studio 本身對它的支持也有 BUG(例如切換編寫文件所屬的項目經常會失敗)。
新的 csproj 文件能夠指定多個開發框架。這樣,我們便能同時編寫適用于 .NET Framework 4.5 的和 .NET Standard 2.0 的代碼,同時還能夠得到 Visual Studio 和擴展插件較好的支持。
.NET Standard 和 .NET Core 項目在創建之時就已經是新的 csproj 格式了,但 .NET Framework 項目、UWP/WPF 項目依然使用舊風格的 csproj 文件。對于 .NET Framework 項目,可以通過 將 WPF、UWP 以及其他各種類型的舊樣式的 csproj 文件遷移成新樣式的 csproj 文件 - walterlv 一文進行遷移。不過對于 WPF/UWP 項目,根本就沒有跨多個 SDK 的必要,就不要改了……
如果是新開項目——強烈建議先按照 .NET Standard 項目類型建好,再修改成多開發框架。
如何指定多個開發框架
只要是新 csproj 文件,指定多個開發框架真的是相當的簡單。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>net45;netstandard2.0</TargetFrameworks></PropertyGroup><!-- 這個文件里的其他內容 --> </Project>請特別注意!!!TargetFramework 從單數形式變為了復數形式 TargetFrameworks!!!這個時候,TargetFramework 是編譯時自動指定的。
如果是對以上多框架的項目進行單元測試,考慮到編譯的目標平臺是多個的,單元測試項目也需要指定多個目標框架。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>net471;netcoreapp2.0</TargetFrameworks><IsPackable>false</IsPackable></PropertyGroup><!-- 這個文件里的其他內容 --> </Project>多框架項目的坑以及如何避坑
微軟的官方文檔 How to: Configure Projects to Target Multiple Platforms - Microsoft Docs 中只說了如何指定多個目標框架,并沒有提及設好了之后的坑。
如果多開發框架中包含了低版本的 .NET Framework,例如 4.0/4.5 等,那么這些坑才比較容易凸顯——因為這些版本的 .NET Framework 與 .NET Standard 的第三方庫差異較大。所以,我們需要有方法來解決其第三方庫引用的差異。這時需要在 csproj 文件中指定包含條件。例如:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>net471;netcoreapp2.0</TargetFrameworks><OutputType Condition="'$(TargetFramework)'!='netcoreapp2.0'">Exe</OutputType><IsPackable>false</IsPackable></PropertyGroup><!-- 這里的引用是二者共有的 --><ItemGroup><PackageReference Include="MSTest.TestAdapter" Version="1.2.0" /><PackageReference Include="MSTest.TestFramework" Version="1.2.0" /></ItemGroup><!-- 這里的引用用于非 .NET Core 框架 --><ItemGroup Condition="'$(TargetFramework)'!='netcoreapp2.0'"><PackageReference Include="Xxx" Version="1.0.*" /></ItemGroup><!-- 這里的引用用于 .NET Core 框架 --><ItemGroup Condition="'$(TargetFramework)'=='netcoreapp2.0'"><PackageReference Include="Yyy" Version="1.0.*" /></ItemGroup></Project>參考資料
- impromptu-interface/ImpromptuInterface.csproj at master · ekonbenefits/impromptu-interface
- How to: Configure Projects to Target Multiple Platforms - Microsoft Docs
轉載于:https://www.cnblogs.com/walterlv/p/10236498.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的让一个 csproj 项目指定多个开发框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动磁盘格式化了,要如何寻回数据
- 下一篇: 吴恩达“机器学习”——学习笔记六