Maui的學習之路(二)--設置

Maui的學習之路(二) -- 設置

上一篇我們做了Maui的基本介紹,理論上這一篇應該會創建第一個Maui的應用,以便對此進行詳細的評估,并逐步深入。

如果你需要進行Maui首個應用的創建,那么歡迎訪問.NET MAUI 創建移動應用—Get Start (qq.com),以及MAUI與Blazor共享一套UI,媲美Flutter,實現Windows、macOS、Android、iOS、Web通用UI (qq.com),本文的重點不是創建Maui的應用而是如何更好的配置Maui的工程。

解決煩人的“obj”

長久以來都有一個問題深深得困擾著我們,每當c#程序編譯后,總會在項目文件夾下生成“obj”目錄,非常刺眼,一旦提交git我們需要進行逐個排除(如果項目很多會生不如死)這讓人非常惱火。那么我們能不能把他移走?

在完成以下設置之前,請跟我做如下的事情:

  1. 創建一個c++工程(我們并非是要進行c++程序開發而是他會對我們后續的學習產生非常積極的作用)

4714de0101f73200c9993c5caad7dc25.png(這里我創建了一個C++ Console工程)

  1. 創建一個xml文件,把他重命名為Directory.build.props(這個名稱隨意,只是喜歡這么叫)

9f09126f8aa32c58ca7830ee8fe9ba3a.png4cb08a4662d23a857bc212fbba34b894.png8e5c2dd89201c81493a32d27d3b7ddf3.png
  1. 雙擊Directory.build.props文件打開并編輯,刪除xml中所有內容,在該文件中添加如下設置

<Project><PropertyGroup><BaseIntermediateOutputPath>$(MSBuildThisFileDirectory).vs\$(SolutionName)\Intermediate\$(MSBuildProjectName)\</BaseIntermediateOutputPath></PropertyGroup>
</Project>

這里我不會介紹BaseIntermediateOutputPath這個設置字段的用意,如果你需要知道請訪問:常用的 MSBuild 項目屬性 - MSBuild | Microsoft Docs[1](如果你是用的是vs2022 for mac,那么很抱歉的告訴你他不支持這個屬性,我在官方的issue翻閱過這個bug早在vs2019 for mac就存在,只不過微軟視而不見),所以為了避免尷尬的事情發生,我們需要加上一個條件判定,這個條件就是當操作系統是windows時這個設置項才生效

<!--這個屬性可以讓你跟obj?say?goodbye--><PropertyGroup?Condition="$([MSBuild]::IsOSPlatform('windows'))"><BaseIntermediateOutputPath>$(MSBuildThisFileDirectory).vs\$(SolutionName)\Intermediate\$(MSBuildProjectName)\</BaseIntermediateOutputPath></PropertyGroup>

在這里我不得不說微軟vs團隊是真的強大,你只需要安裝vs就能在不同的平臺打開同一份代碼,而不需要做其他的編譯設置

我們是一家人

當一個解決方案(Solution)存在多個項目時(csproj),我們一定希望所有項目生成的dll或者exe以及配置文件都統統編譯生成到一個固定的地方,通常我們都會手動設置編譯生成路徑,這個方式極不推薦因為你所做的選擇總是一個不可靠的路徑(如果這是一個團隊合作的項目),我們只需要做如下一點點改變(該設置仍然是在Directory.build.props中進行添加)

<PropertyGroup><!--這個屬性可以讓你規劃統一生成路徑--><OutputPath>$(MSBuildThisFileDirectory)Binary\</OutputPath></PropertyGroup>

讓他成為全部

我們常常有這樣的思考,能不能在一個地方配置,所有工程都能有改變,比如Nullable的啟用,比如C#的語言版本等等,那么只需要對Directory.build.props增加如下配置

<PropertyGroup><!--這個屬性可以讓你規劃統一生成路徑--><OutputPath>$(MSBuildThisFileDirectory)Binary\</OutputPath><LangVersion>latest</LangVersion><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

不能沒有你

你是否有這樣的困惑,當我的解決方案(Solution)下的所有項目(csproj)都需要用到同一個package時,我能否只要做一次包的引用行為?接下來請跟我一起操作:

  1. 創建一個xml(這已經很熟悉了),將他改名為Directory.build.targets(我喜歡這個名字)

ea36e6d4d9278e12877e8f4095d57d4c.pngfc878a30128c3e9663929bbb363c664c.png
  1. Directory.build.targets中的內容修改為:

<Project><!--這樣的設計可以讓你當前解決方案下的所有項目都能獲取到package--><ItemGroup><PackageReference?Include="Newtonsoft.Json"?Version="13.0.1"?/></ItemGroup>
</Project>

讓他變得主動

完成上述設置你已經成為一個解決方案管理高手了,但是這還不夠,我們都知道.net6或者是c#10引入了文件級別的命名空間(File-scoped)你只需要寫一個 namespace xxx,更少的大括號讓你的代碼看起來更加簡潔,很可惜如果你不做任何改變,那么他永遠不會那么主動,你創建的默認class他一定長這樣:

namespace?MauiLib1
{internal?class?Class2{}
}

請跟我完成以下操作,他會變得更聽話:

  1. 創建一個editorconfig

8e70f9716a7325685068ef45eb60e059.png318fe658c5f826a3495bab162ab4c87f.png
  1. 雙擊.editorconfig,開啟File scped配置(如果你打開的不是設置界面而是直接打開的文本,請不用擔心,在下一次重啟后再完成后續的設置即可)

6d24f312ea167c1005e32ea71c8c1cc1.png

至此你就完成了部分高效設置,關閉vs,重新打開解決方案,上述所有設置才會生效,別忘了刪除已經產生的編譯垃圾,如以下這些:

ab699824875751a76fc2ed35cfc7f5da.png

此時你創建的新的class,他變成了這樣:

namespace?MauiLib1;
internal?class?Class3
{
}

重新編譯解決方案,你的所有dll和exe都已經生成到binary下面了,每一個csproj目錄下都相當干凈了(注意以上設置對c++工程無效,c++工程需要單獨配置,這里不做介紹。

別忘了他

完成上述設置,我們剛剛創建的c++工程似乎都沒有起到任何作用,沒錯c++工程只是給你看看的(我就是玩兒你),接下來我們需要探討的是,這些你是怎么知道的(如圖)

49cdadbe124a849624480115e18b2cfa.png

其實這些是vs的一些內置宏定義,我們在c#中無法得知為什么有這些宏,此時我們需要用到c++項目

bce4dbe59769ded61eb10731c299e64d.png1c5a2e1de6899caa50d561bd36566f47.png8c655d7828df89f7398e65d791ef5cfd.png20313a1becad5a1aa0ea9377fd63b265.png

在這里你可以看到這些形形色色的設置字段以及對應宏所顯示的值了,這個宏是屬于vs的,所以c#工程也有效

給得實在太多了

接下來我們會進行一些Maui的深層設置探討,在Windows上,總是默認給我編譯出androidiosmaccatalyst,太多了我根本不需要,那么可以修改TargetFrameworks(比如像這樣)

a5f73770ddf66e1d2e04a9d744756556.png

注意:一旦修改了這項,也就意味著你再也不能夠選擇其他平臺查看代碼是否正確(代碼可靠性將得不到保證)(去掉其他平臺編譯設置最直觀的表象就是編譯變得異常的快)

讓她變得忠誠

當我生成Window的應用時,我們要引用一個Window平臺相關的package,比如我們很熟悉的Pinvoke.User32,很明顯這個庫只適合Windows平臺,其他平臺引用過去雖然不會造成編譯錯誤,但是在打包文件內勢必會有這個一個不相關的dll(也許沒有我沒測試過,我猜他有),這是我們不希望看到的,所以我們要這樣:

<!--這是一個專屬于Windows的設定,讓他成為Windows忠誠的伴侶-->
<ItemGroup?Condition="$(TargetFramework.Contains('-windows'))"><!--?Required?-?WinUI?does?not?yet?have?buildTransitive?for?everything?--><PackageReference?Include="PInvoke.User32"?Version="0.7.104"?/>
</ItemGroup>

他們需要隔離

在編寫代碼時,我們通常會遇到我的部分代碼是適用于Windows的而不適用于其他平臺,此時你可以使用編譯宏命令 #if #elif #else #endif

public?static?MauiApp?CreateMauiApp()
{var?builder?=?MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts?=>{fonts.AddFont("OpenSans-Regular.ttf",?"OpenSansRegular");fonts.AddFont("OpenSans-Semibold.ttf",?"OpenSansSemibold");});#if?WINDOWSstring??name?=?"Windows";
#elif?MACCATALYSTstring??name?=?"Mac";
#elsestring??name?=?"Mobile";
#endifreturn?builder.Build();
}

讓他做回自己

我們很期待使用Maui編寫的Windows應用雙擊exe就能夠直接運行(這在以前是個奢望),現在你只需要修改兩項設置就可以做到(在主程序的工程文件csproj),增加如下兩個配置(使用該配置后就不再支持anycpu編譯,所以我們做一個條件編譯):

<!--這個方案可以讓你的Maui在Windows下生成的exe做回自己-->
<PropertyGroup?Condition="'$(Platform)'?!=?'AnyCPU'?And?$(TargetFramework.Contains('-windows'))"><!--?Unpack?:?SelfContainedDeployment?for?winui3?--><WindowsPackageType>None</WindowsPackageType><WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
</PropertyGroup>

多編譯平臺配置

在上一項改動中,因為需要實現exe直接運行,增加的設置在anycpu編譯環境下是完全不支持的,所以你需要配置多平臺編譯方案(比如x64 x86 ARM64等),配置方法如下:

  1. 點開 Configuration Manager29e1bc4cec925ec533c08c14b4af0186.png

  2. 新增 X64等平臺編譯81bc0693c2c34b48e2726180c64592ad.png

7bca6cad6cec1c2013fdc192713ec446.png

綜上,我們完成了解決方案(Solution)以及項目(csproj)中的絕大多數設置,做好這些設置會讓你一部分工作變得得心應手。

以上設置都已上傳github[2]

參考資料

[1]

常用的 MSBuild 項目屬性 - MSBuild | Microsoft Docs: https://docs.microsoft.com/zh-cn/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022

[2]

github: https://github.com/WPFDevelopersOrg/Demo

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285645.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285645.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

今天,Java編程周末提高班(第一期)正式結束

Java編程周末提高班&#xff08;第一期&#xff09;&#xff0c;走過了近兩個月歷程&#xff0c;一共同擁有68人次學生周末到老師家進行Java學習與交流。近距離的和一群年輕的學習接觸&#xff0c;收獲非常多&#xff0c;特別是對以后教學的改進。在學習的閑暇。大家自己做飯&a…

基本反射了解

1 package cn.wh;2 /**3 * java.lang.Class4 * author 王恒5 * time 2016年11月2日 上午10:39:256 */7 public class RedlectTest {8 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {9 …

【PhotoScan精品教程】任務四:PhotoScan做空三+CC生成正射、三維建模綜合案例

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho、GodWork) 【PhotoScan精品教程】任務一:新建工程、導入照片、設置坐標系、導入控制點(POS)、自由空三 【PhotoScan精品教程】任務二:刺像控點,平差,質量報告精度檢查,像控點POS權重調配 【…

[轉]讓.NET應用秒變微服務

隨著近年來微服務的發展&#xff0c;許多團隊開始將自己的單體應用改造為微服務。通常Java或Go的應用可以通過業界已有的微服務框架作為微服務開發和改造的底座&#xff0c;封裝掉解決跨網絡問題帶來的復雜性。但以Chassis模式進行的微服務改造有兩大問題&#xff1a;多語言框架…

C語言九十三之輸入一個字符x,找到輸入的那句話(字符串)里面一樣字母的位置。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 輸入一個字…

WPF 使用 MAUI 的自繪制邏輯

這是一個當前還沒開發完成的功能&#xff0c;準確來說連預覽版也算不上的功能。我原本以為 MAUI 是無法在 WPF 上面跑的&#xff0c;然而在看完了 MAUI 整個大的設計&#xff0c;才了解到&#xff0c;原來 MAUI 是一個非常龐大的開發項目。在 MAUI 里面&#xff0c;雖然現在是正…

[轉]redis 5.0.5 5分鐘搭建redis集群

環境&#xff1a;centos 7 1&#xff1a;下載并安裝redis ???????$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz$ tar xzf redis-5.0.5.tar.gz$ cd redis-5.0.5$ make redis 5.0版本 集群搭建不需要我們安裝ruby就可以搭建成功&#xff0c;并且redis…

【土地評價與土地管理】案例:某地區柑橘種植適宜性評價

文章目錄 一、確定評價單元二、評價因子選擇三、評價因子權重的確定四、構建評價分級標準五、綜合評價六、適宜性等級劃分七、得出適宜性評價結果柑橘種植所需的自然條件: 柑橘果樹生長發育、開花結果與溫度、日照、水分(濕度)、土壤以及風、海拔、地形和坡向等環境條件緊密相…

django中怎樣生成非HTML格式的內容。

某些時候可能有這種需求。在網頁中點擊一個鏈接或者一個button希望返回一張圖片、一個pdf文檔、一個csv文檔等而非HTML。在diango中非常easy做到這些。django中的view用來接收http request并返回web response。通常情況下&#xff0c;返回的內容為HTML&#xff0c;但其可以返回…

Window.document對象

一、找到元素&#xff1a; docunment.getElementById("id")&#xff1b;根據id找&#xff0c;最多找一個&#xff1b; var a docunment.getElementById("id");將找到的元素放在變量中&#xff1b; docunment.getElementsByName("name")&am…

C# 讀寫文件從用戶態切到內核態,到底是個什么流程?

一&#xff1a;背景 1. 一個很好奇的問題我們在學習 C# 的過程中&#xff0c;總會聽到一個詞叫做 內核態 &#xff0c;比如說用 C# 讀寫文件&#xff0c;會涉及到代碼從 用戶態 到 內核態 的切換&#xff0c;用 HttpClient 獲取遠端的數據&#xff0c;也會涉及到 用戶態 到 內核…

C語言九十四之請編寫函數fun(char *str, int n),其功能是:使字符串str的前導*號不能多余n個,若多于n個,則刪除多余的*號,若少于或等于n個,則不做處理。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 規定輸入的…

【土地評價與土地管理】案例:某地區土地農業利用潛力評價

文章目錄 一、確定評價單元二、擬定潛力評價系統表、確定指標權重三、指標評價四、評定潛力等級五、得出潛力評價結果一、確定評價單元 土地潛力評價單元采用地塊作為評價單元,此地塊是建立在土地利用現狀的基礎上, 綜合土地的自然屬性來確定,評價單元界線與土地現有界線基本…

WIKIOI 1519 過路費

1519 過路費 1519 過路費 時間限制: 1 s 空間限制: 256000 KB 題目等級 : 大師 Master 題解 題目描述 Description 在某個遙遠的國家里&#xff0c;有 n個城市。編號為 1,2,3,…,n。這個國家的政府修建了m 條雙向道路&#xff0c;每條道路連接著兩個城市。政府規定從城市…

code point,code unit

2019獨角獸企業重金招聘Python工程師標準>>> 從一段API描述談起&#xff1a; 在String的length的API中描述是這樣的&#xff01; lengthpublic int length() Returns the length of this string. The length is equal to the number of 16-bit Unicode characters i…

Android之解決JsonObject里面的JsonArray數據會有斜杠問題

1、問題 本地保存了多個json格式的字符串 {"event":"sdk_ad_request_status","timestamp":1640180549231,"ad_app_id":"10104","pool_test":0,"ad_type":0,"ad_request_time":0,"requ…

【土地評價與土地管理】案例:蘭州市榆中縣農用地分等

文章目錄 一、資料收集二、確定標準耕作制度、基準作物、指定作物、光溫(氣候生產潛力)三、劃分指標區,確定分等因素及權重四、編制“指定作物-分等因素-自然質量分”記分規則表五、繪制分等因素分值圖,劃分分等單元六、計算農用地自然質量分七、計算自然質量等指數八、計算…

.NET7之MiniAPI(特別篇) :Preview5優化了JWT驗證(下)

Preview5對策略驗證的方式沒有改變&#xff0c;只不過內置了Token的生成&#xff0c;和《.NET6之MiniAPI(十)&#xff1a;基于策略的身份驗證和授權》的驗證方式基本相同&#xff0c;都是生成和驗證使用的驗證參數要一致&#xff0c;用繼承AuthorizationHandler的子類來作每次請…

業務多變的公司上云后蒸蒸日上

一、云服務器與傳統服務器的對比 1&#xff09;、傳統服務器 傳統服務器是一個獨立的硬件設備,可以理解成是一臺放在機房的高配置電腦,可根據需求安裝各種操作系統以及配置各種環境,性能也比較強大。 2&#xff09;、云服務器 云服務器是構建在硬件服務器集群之上&#xff0c;…

2016福州大學軟件工程第四次團隊作業-系統設計成績匯總

第四次團隊作業——系統設計打分統計結果如下&#xff1a; 學號組別團隊分數貢獻比例個人分數031401433606notconnected141613.83031402606606notconnected141413.33031402618606notconnected141814.34031402629606notconnected141413.33031402631606notconnected141914.590314…