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.mzph.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…