.NET MAUI 実行に必要なファイルは一つのプロジェクトファイル(csproj)にまとめられている。

2023年3月17日



今回の記事では、マルチプラットフォーム アプリケーションの開発における革新的なフレームワークである .NET MAUI についてお話しします。.NET MAUI は、.NET Multi-platform App UI の略で、クロスプラットフォーム開発をより簡単にするために作られました。

従来のモバイルアプリケーション開発では、Android、iOS、および他のプラットフォームのために個別のプロジェクトファイルを作成する必要がありました。これにより、アプリケーションの共有コードやリソースを更新する際に手間がかかり、保守性も低下してしまいます。

しかし、.NET MAUI では、この問題を解決するために、一つのプロジェクトファイル(csproj)に必要なファイルをまとめることができます。これにより、コードやリソースの変更がシームレスに反映され、アプリケーションの開発プロセスがスムーズになります。

.NET MAUI のプロジェクトファイルは、通常の .NET Core プロジェクトファイル(csproj)と非常に似ていますが、いくつかの追加要素があります。これにより、アプリケーションのビルドやデプロイに必要な情報が統合され、一元管理できるようになります。

.NET MAUIのcsprojファイルは、プロジェクトの構成情報を含むXMLファイルです。これは、アプリケーションの実行に必要なファイル、設定、依存関係などを定義します。

新規プロジェクトを作成すると、以下のようなソースコードが自動的に生成されます。

<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
		<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
		<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
		<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
		<OutputType>Exe</OutputType>
		<RootNamespace>MauiApp1</RootNamespace>
		<UseMaui>true</UseMaui>
		<SingleProject>true</SingleProject>
		<ImplicitUsings>enable</ImplicitUsings>

		<!-- Display name -->
		<ApplicationTitle>MauiApp1</ApplicationTitle>

		<!-- App Identifier -->
		<ApplicationId>com.companyname.mauiapp1</ApplicationId>
		<ApplicationIdGuid>e830c9bf-cb5b-4431-99cf-56251ece7cec</ApplicationIdGuid>

		<!-- Versions -->
		<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
		<ApplicationVersion>1</ApplicationVersion>

		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
		<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
	</PropertyGroup>

	<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net7.0-ios|AnyCPU'">
	  <CreatePackage>false</CreatePackage>
	</PropertyGroup>
	<ItemGroup>
		<!-- App Icon -->
		<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />

		<!-- Splash Screen -->
		<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />

		<!-- Images -->
		<MauiImage Include="Resources\Images\*" />
		<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />

		<!-- Custom Fonts -->
		<MauiFont Include="Resources\Fonts\*" />

		<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
		<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
	</ItemGroup>

	<ItemGroup>
		<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
	</ItemGroup>

</Project>

1行目:<Project>

MSBuild プロジェクト ファイルの必須のルート要素です。

属性説明
Sdk省略可能な属性です。
バージョンが指定されていない場合、MSBuildは、既定のバージョンを解決しようとします。
たとえば、<Project Sdk="Microsoft.NET.Sdk" /> または <Project Sdk="My.Custom.Sdk/1.0.0" /> のように使用します。

3行目:<PropertyGroup>

属性説明
PropertyGroupユーザー定義の Property 要素のセットを格納します。
MSBuild プロジェクトで使用されるすべての Property 要素は、PropertyGroup 要素の子である必要があります。
<PropertyGroup Condition="'String A' == 'String B'">
    <Property1>...</Property1>
    <Property2>...</Property2>
</PropertyGroup>

<PropertyGroup> には、以下の設定が含まれます。

  • TargetFrameworks:.NET MAUI(.NET マルチプラットフォーム アプリ UI)アプリは、マルチターゲティングを使用して、1 つのプロジェクトから複数のプラットフォームをターゲットにすることができます。TargetFrameworksは、MAUI アプリケーションをターゲットにするプラットフォームの一覧です。複数のプラットフォームをターゲットにする場合は、TargetFrameworks プロパティを使用します。ここでは、Android、iOS、Mac Catalyst、Windows 10 19041 および Tizen をターゲットにします。MSBuild プロジェクトで使用されるすべての Property 要素は、PropertyGroup 要素の子である必要があります。
  • OutputType:このプロジェクトから生成されるファイルの出力タイプを定義します。ここでは、Exe となっています。
  • UseMaui:MAUI プロジェクトであることを示すフラグ。
  • SingleProject:MAUI プロジェクトの場合、true に設定する必要があります。
  • ImplicitUsings:暗黙的な using 宣言を有効にするかどうかを指定します。

TargetFramework (単数形) が指定されている場合、このTargetFrameworksプロパティは無視されます。

7行目:tizenを開発する場合は、こちらはコメントアウトしてから使用してください。

<ApplicationTitle>、<ApplicationId>、<ApplicationIdGuid>、<ApplicationDisplayVersion>、<ApplicationVersion> などの要素によって、アプリケーションの名前、ID、バージョンなどの情報が定義されます。

<ItemGroup> には、パッケージ参照や条件付きのプロパティが含まれます。

<MauiIcon>、<MauiSplashScreen>、<MauiImage>、<MauiFont>、<MauiAsset> などの要素によって、MAUI アプリケーションのためのアセットが指定されます。ここでは、アプリアイコン、スプラッシュスクリーン、画像、フォント、その他のファイルの場所が指定されています。

  • PackageReference には、Microsoft.Extensions.Logging.Debug が含まれています。
  • Condition 属性は、特定の条件下でプロパティを設定するために使用されます。例えば、Debug ビルドが net7.0-ios プラットフォームにのみ適用されるように設定されています。

.NET 6 からのアップグレード

プロジェクトを .NET 6 から .NET 7 にアップグレードするには、 .csproj ファイルを開き、ターゲット フレームワーク モニカー (TFM(Target Framework Moniker)) を 6 から 7 に変更します。

<TargetFrameworks>net6.0-ios;net6.0-android;net6.0-maccatalyst;net6.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041</TargetFrameworks>
<TargetFrameworks>net7.0-ios;net7.0-android;net7.0-maccatalyst;net7.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net7.0-windows10.0.19041</TargetFrameworks>