前回はMauiの基本的な紹介を行いました。理論的には、この記事では、詳細な評価と段階的なステップバイステップのために、最初のMauiアプリケーションを作成するはずです。
如果你需要进行 Maui 首个应用的创建,那么欢迎访问.NET MAUI 创建移动应用—Get Start,以及MAUI 与 Blazor 共享一套 UI,媲美 Flutter,实现 Windows、macOS、Android、iOS、Web 通用 UI,本文的重点不是创建 Maui 的应用而是如何更好的配置 Maui 的工程。
“OBJ”を削除する
長い間、私たちを深く悩ませる問題がありました。c#プログラムがコンパイルされるたびに、常にプロジェクトフォルダの下に“obj”ディレクトリが生成され、非常にまぶしいです。gitをコミットすると、個別に除外する必要があります(プロジェクトが多い場合は死ぬことができます)。彼を連れ出せないのか?
以下の設定を完了する前に、以下のことをしてください:
- Cプロジェクトを作成する(Cプログラムを開発するのではなく、その後の学習に非常にポジティブな影響を与えます)。

创建一个 xml 文件,把他重命名为Directory.build.props(这个名称随意,只是喜欢这么叫)



双击Directory.build.props文件打开并编辑,删除 xml 中所有内容,在该文件中添加如下设置
<Project>
<PropertyGroup>
<BaseIntermediateOutputPath>$(MSBuildThisFileDirectory).vs\$(SolutionName)\Intermediate\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
</PropertyGroup>
</Project>
这里我不会介绍BaseIntermediateOutputPath这个设置字段的用意,如果你需要知道请访问:常用的 MSBuild 项目属性 - MSBuild | Microsoft Docs(如果你是用的是 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>
Microsoft vs Teamは本当に強力で、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>
あなたなしでは。
私のソリューションの下にあるすべてのプロジェクト(csproj)が同じパッケージを使用する必要があるとき、パッケージの参照動作を一度だけ実行できるかどうか混乱していますか?一緒に働いてください:
- 创建一个 xml(这已经很熟悉了),将他改名为
Directory.build.targets(我喜欢这个名字)


- 将
Directory.build.targets中的内容修改为:
<Project>
<!--这样的设计可以让你当前解决方案下的所有项目都能获取到package-->
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
積極的になる。
上記のセットアップを完了すると、あなたはソリューション管理の達人になりましたが、それだけでは十分ではありません。. net 6またはc#10はファイルレベルの名前空間を導入しました。名前空間xxxを書くだけで、コードをより簡潔に見せるために中括弧が少なくなります。残念ながら、何も変更しなければ、彼はそれほど積極的ではなく、作成したデフォルトクラスはこのように長くなります:
namespace MauiLib1
{
internal class Class2
{
}
}
私と一緒に次のことをしてください、彼はもっと従順になります:
- Editorconfigの作成


- editorconfigをダブルクリックしてFile scped設定を開きます(セットアップ画面ではなく、テキストを直接開いている場合は、心配しないでください。次の再起動後に設定を完了してください)。

** これで、効率的な設定の一部が完了し、vsを閉じてソリューションを再度開き、上記のすべての設定が有効になるまで、生成されたコンパイル済みのジャンクを削除することを忘れないでください:*

** 新しいクラスを作成すると、このようになります:**
namespace MauiLib1;
internal class Class3
{
}
** ソリューションを再コンパイルすると、すべてのdllとexeがバイナリの下に生成され、各csprojディレクトリはかなりきれいになります(上記の設定はCプロジェクトでは動作しません。Cプロジェクトは別々に設定する必要がありますので、ここでは説明しません。
忘れないでください。
上記のセットアップを完了すると、私たちが作成したばかりのCプロジェクトは何の役にも立たないようです。はい、Cプロジェクトはあなたに見せているだけです(私はあなたを演じています)、次に議論する必要があるのは、あなたがこれらを知る方法です(図)。

実際には、これらはVSの組み込みマクロ定義の一部であり、C#ではこれらのマクロが存在する理由を知ることはできません。




** ここでは、これらの様々な設定フィールドと対応するマクロの値を見ることができます。このマクロはvsに属するので、c#プロジェクトも動作します。
与えすぎている。
次にMauiの深いセットアップについて少し説明します。Windowsでは、常にデフォルトでandroid 、ios、maccatalystをコンパイルしてくれますが、必要ないので、TargetFrameworksを変更することができます(このように)。

注意:一度変更すると、コードが正しいかどうかを確認するために他のプラットフォームを選択できなくなります(コードの信頼性は保証されません)(他のプラットフォームのコンパイル設定を削除する最も直感的な外観は、コンパイルが異常に速くなることです)
忠実であること。
Windowsアプリケーションを生成するときは、Pinvoke. User 32のようなWindowsプラットフォーム関連のパッケージを参照する必要があります。このライブラリは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 WINDOWS
string? name = "Windows";
#elif MACCATALYST
string? name = "Mac";
#else
string? name = "Mobile";
#endif
return builder.Build();
}
彼を自分自身に戻しなさい。
Mauiで書かれたWindowsアプリケーションをダブルクリックしてexeを直接実行することを期待していましたが(これは以前は贅沢でした)、現在は2つの設定(メインプログラムのプロジェクトファイルcsproj)を変更し、次の2つの設定を追加するだけです(この設定では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コンパイル環境では完全にサポートされていないため、マルチプラットフォームコンパイル方式(x 64 x 86 ARM64など)を設定する必要があります。
- Configuration Managerを開く

- X 64などのプラットフォームを追加


** 要約すると、ソリューションSolutionとプロジェクトcsprojの設定の大部分が完了しました。これらの設定をうまく行うと、作業の一部が便利になります。**
以上设置都已上传github