日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让一个 csproj 项目指定多个开发框架

發布時間:2025/5/22 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让一个 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 项目指定多个开发框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。