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 …

[转]让.NET应用秒变微服务

随着近年来微服务的发展&#xff0c;许多团队开始将自己的单体应用改造为微服务。通常Java或Go的应用可以通过业界已有的微服务框架作为微服务开发和改造的底座&#xff0c;封装掉解决跨网络问题带来的复杂性。但以Chassis模式进行的微服务改造有两大问题&#xff1a;多语言框架…

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…

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;也会涉及到 用户态 到 内核…

【土地评价与土地管理】案例:某地区土地农业利用潜力评价

文章目录 一、确定评价单元二、拟定潜力评价系统表、确定指标权重三、指标评价四、评定潜力等级五、得出潜力评价结果一、确定评价单元 土地潜力评价单元采用地块作为评价单元,此地块是建立在土地利用现状的基础上, 综合土地的自然属性来确定,评价单元界线与土地现有界线基本…

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…

【土地评价与土地管理】案例:兰州市榆中县农用地分等

文章目录 一、资料收集二、确定标准耕作制度、基准作物、指定作物、光温(气候生产潜力)三、划分指标区,确定分等因素及权重四、编制“指定作物-分等因素-自然质量分”记分规则表五、绘制分等因素分值图,划分分等单元六、计算农用地自然质量分七、计算自然质量等指数八、计算…

业务多变的公司上云后蒸蒸日上

一、云服务器与传统服务器的对比 1&#xff09;、传统服务器 传统服务器是一个独立的硬件设备,可以理解成是一台放在机房的高配置电脑,可根据需求安装各种操作系统以及配置各种环境,性能也比较强大。 2&#xff09;、云服务器 云服务器是构建在硬件服务器集群之上&#xff0c;…

2016福州大学软件工程第四次团队作业-系统设计成绩汇总

第四次团队作业——系统设计打分统计结果如下&#xff1a; 学号组别团队分数贡献比例个人分数031401433606notconnected141613.83031402606606notconnected141413.33031402618606notconnected141814.34031402629606notconnected141413.33031402631606notconnected141914.590314…

[转]在C#中像Python一样编写TensorFlow机器学习代码

机器学习是一个令人激动人心的领域&#xff0c;一直有新的技术突破。研究人员不断推动机器智能的提升&#xff0c;教机器如何听说读写——这些曾经是我们人类专属的技能。机器学习的首选语言是Python&#xff0c;最受欢迎的库是Google的TensorFlow。几乎所有的代码示例都是用Py…

【土地评价与土地管理】教案 第一章:土地评价要素的选择

文章目录 1.1 土地构成要素与其农业利用1、光能条件2、热量条件3、降水条件1.1 土地构成要素与其农业利用 1、光能条件  光能是绿色植物进行光合作用和生物运动发展的主要能源  太阳辐射、日照时数  太阳辐射量随地域和季节变化较大,导致了土地利用的多样性和土地资源…

Blazor University (33)表单 —— EditContext、FieldIdentifiers

原文链接&#xff1a;https://blazor-university.com/forms/editcontext-fieldidentifiers-and-fieldstate/EditContext、FieldIdentifiers 和 FieldState请注意&#xff0c;对于那些希望了解 Blazor 如何“在后台”工作的人来说&#xff0c;这是一个高级主题。无需了解此信息即…

团队项目开发篇章8

例会时间&#xff1a;2016.11.3 整理&#xff1a;姬索肇 例会照片 每个人的工作 任务分配 我们今天与王鹿鸣学长和李云涛学长针对团队开发过程中遇到的问题进行了讨论&#xff0c;非常感谢学长们的热心帮助&#xff0c;同时我们也被他们强大的编程能力所折服~ 在这里为学长们点…

【地理信息系统GIS】教案(七章全)第一章:地理信息系统概述

文章目录 第一节 GIS基本概念第二节 GIS的组成第三节 GIS的功能第四节 GIS的发展第一节 GIS基本概念 1.1 GIS基本概念 1、信息 是用文字、数字、符号、语言、图象、图形等介质来表达事件、事物或现象等的内容、数量和特征,从而向人们(或系统)提供关于现实世界新的事实和知…

表达式的动态解析和计算,Flee用起来真香

前言在很多项目中经常会出现需要动态解析表达式和计算的场景&#xff0c;比如一些自动审核规则&#xff0c;或者是一些变量的值通过维护的公式在运行过程中动态算出&#xff1b;由于场景需求&#xff0c;都需要比较灵活的配置对应的表达式&#xff0c;然后希望在需要的时候能根…

C语言九十五之实现经典的反转数组(通过指针或数组下标操作)

✅作者简介&#xff1a;大家好我是码玛莎拉蒂&#xff0c;CSDN博客专家&#x1f947;&#x1f947;&#x1f947; &#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;C语言试题200例 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449; 点击跳转…

Linux下使用shell实现上传linux下某个目录下所有文件到ftp

首先我们需要搞清楚单个文件怎么上传&#xff0c;把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后&#xff0c;需要弄清楚怎么实现遍历一个目录下的所有文件的&#xff0c;把这个遍历某个目录下的文件实现命名为&#xff1a;foeach_directory_and_uplo…