.NET MAUI 単一プロジェクトから複数のプラットフォームをターゲットとする

.NET マルチプラットフォーム アプリ UI (.NET MAUI) 単一プロジェクトでは、アプリの開発時に通常発生するプラットフォーム固有の開発エクスペリエンスを利用し、Android、iOS、macOS、および Windows をターゲットにできる 1 つの共有プロジェクトに抽象化します。

.NET MAUI 単一プロジェクトでは、対象となるプラットフォームに関係なく、簡素化された一貫性のあるクロスプラットフォーム開発エクスペリエンスが提供されます。 .NET MAUI 単一プロジェクトには、次の機能があります。

  • Android、iOS、macOS、Tizen、Windows をターゲットにできる 1 つの共有プロジェクト。
  • .NET MAUI アプリを実行するための簡略化されたデバッグ ターゲットの選択。
  • 1 つのプロジェクト内の共有リソース ファイル。
  • アプリのタイトル、ID、バージョンを指定する 1 つのアプリ マニフェスト。
  • 必要に応じて、プラットフォーム固有の API とツールにアクセスできます。
  • 単一のクロスプラットフォーム アプリ エントリ ポイント。

.NET MAUI 単一プロジェクトは、マルチターゲットと SDK スタイルのプロジェクトの使用を使用して有効になります。

リソース ファイル

クロスプラットフォーム アプリ開発のリソース管理は、従来は問題でした。各プラットフォームには、リソースを管理するための独自のアプローチがあるためです。 たとえば、各プラットフォームには異なるイメージ要件があり、通常は異なる解像度で各イメージの複数のバージョンを作成する必要があります。 したがって、通常、1 つのイメージを異なる解像度で複数回複製する必要があり、結果のイメージでは、各プラットフォームで異なるファイル名とフォルダーの規則を使用する必要があります。

.NET MAUI 単一プロジェクトを使用すると、各プラットフォームで使用されている間、リソース ファイルを 1 つの場所に格納できます。 これには、.NET MAUI アプリのスタイルを設定するためのフォント、画像、アプリ アイコン、スプラッシュ スクリーン、生アセット、CSS ファイルが含まれます。 各イメージ リソース ファイルはソース イメージとして使用され、ビルド時にプラットフォームごとに必要な解像度のイメージが生成されます。

注意

iOS アセット カタログは現在、.NET MAUI 単一プロジェクトではサポートされていません。

リソース ファイルは通常、.NET MAUI アプリ プロジェクトの Resources フォルダー、または Resources フォルダーの子フォルダーに配置し、ビルド アクションを正しく設定する必要があります。 次の表は、各リソース ファイルの種類のビルド アクションを示しています。

リソース ビルド アクション
アプリのアイコン MauiIcon
フォント MauiFont
イメージ MauiImage
スプラッシュ スクリーン MauiSplashScreen
未加工アセット MauiAsset
CSS ファイル MauiCss

注意

XAML ファイルは .NET MAUI アプリ プロジェクトにも格納され、プロジェクトテンプレートと項目テンプレートによって作成されると MauiXaml ビルドアクションが自動的に割り当てられます。 ただし、XAML リソース ディクショナリのみが通常、アプリ プロジェクトの Resources フォルダーに配置されます。

リソース ファイルが .NET MAUI アプリ プロジェクトに追加されると、CSS ファイルを除き、リソースの対応するエントリがプロジェクト (.csproj) ファイルに作成されます。 次のスクリーンショットは、各 リソース の種類の子フォルダーを含む一般的な Resources フォルダーを示しています。

画像とフォントのリソースのスクリーンショット。

リソースが正しい Resources 子フォルダーに追加されている場合、リソース ファイルのビルド アクションは正しく設定されます。

Resources フォルダーの子フォルダーは、アプリのプロジェクト ファイルを編集することで、リソースの種類ごとに指定できます。

<ItemGroup>
    <!-- Images -->
    <MauiImage Include="Resources\Images\*" />

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

    <!-- Raw assets -->
    <MauiAsset Include="Resources\Raw\*" />
</ItemGroup>

ワイルドカード文字 (*) は、フォルダー内のすべてのファイルが、指定したリソースの種類のファイルとして扱われることを示します。 さらに、子フォルダーのすべてのファイルを含めることもできます。

<ItemGroup>
    <!-- Images -->
    <MauiImage Include="Resources\Images\**\*" />
</ItemGroup>

この例では、二重ワイルドカード文字 ('**') は 、Images フォルダーに子フォルダーを含めることができることを指定します。 したがって、 <MauiImage Include="Resources\Images\**\*" />Resources\Images フォルダー内のファイル、または Images フォルダーの子フォルダーをソース イメージとして使用し、プラットフォームごとに必要な解像度のイメージを生成するように指定します。

プラットフォーム固有のリソースは、共有リソースに対応するリソースをオーバーライドします。 たとえば、Android 固有のイメージ がPlatforms\Android\Resources\drawable-xhdpi\logo.pngにあり、共有 Resources\Images\logo.svg イメージも提供している場合、プラットフォーム固有のイメージとして既に存在する XHDPI イメージを除き、スケーラブル ベクター グラフィックス (SVG) ファイルを使用して必要な Android イメージが生成されます。

アプリ アイコン

アプリ アイコンをアプリ プロジェクトに追加するには、プロジェクトの Resources\AppIcon フォルダーにイメージをドラッグします。このフォルダーのビルド アクションは自動的に MauiIcon に設定されます。 これにより、プロジェクト ファイルに対応するエントリが作成されます。

<MauiIcon Include="Resources\AppIcon\appicon.svg" />

ビルド時に、アプリ アイコンのサイズをターゲット プラットフォームとデバイスの正しいサイズに変更できます。 その後、サイズ変更されたアプリ アイコンがアプリ パッケージに追加されます。 アプリ アイコンは、デバイスやアプリ ストアでアプリを表すために使用されるなど、複数の用途があるため、複数の解像度にサイズ変更されます。

詳細については、「 .NET MAUI アプリ プロジェクトにアプリ アイコンを追加する」を参照してください。

イメージ

イメージは、プロジェクトの Resources\Images フォルダーにドラッグすることでアプリ プロジェクトに追加できます。ここで、ビルド アクションは自動的に MauiImage に設定されます。 これにより、プロジェクト ファイルに対応するエントリが作成されます。

<MauiImage Include="Resources\Images\logo.svg" />

ビルド時に、ターゲット プラットフォームとデバイスの正しい解像度にイメージのサイズを変更できます。 その後、結果のイメージがアプリ パッケージに追加されます。

詳細については、「 .NET MAUI アプリ プロジェクトにイメージを追加する」を参照してください。

フォント

True 型形式 (TTF) またはオープン型フォント (OTF) フォントは、プロジェクトの Resources\Fonts フォルダーにドラッグすることでアプリ プロジェクトに追加できます。ここで、ビルド アクションは自動的に MauiFont に設定されます。 これにより、プロジェクト ファイルにフォントごとに対応するエントリが作成されます。

<MauiFont Include="Resources\Fonts\OpenSans-Regular.ttf" />

ビルド時に、フォントがアプリ パッケージにコピーされます。

詳細については、「 フォント」を参照してください。

スプラッシュ スクリーン

スプラッシュ スクリーンをアプリ プロジェクトに追加するには、プロジェクトの Resources\Splash フォルダーにイメージをドラッグします。このフォルダーのビルド アクションは自動的に MauiSplashScreen に設定されます。 これにより、プロジェクト ファイルに対応するエントリが作成されます。

<ItemGroup>
  <MauiSplashScreen Include="Resources\Splash\splashscreen.svg" />
</ItemGroup>

ビルド時に、スプラッシュスクリーンイメージはターゲットプラットフォームとデバイスの正しいサイズにサイズ変更されます。 その後、サイズ変更されたスプラッシュ スクリーンがアプリ パッケージに追加されます。

詳細については、「 .NET MAUI アプリ プロジェクトにスプラッシュ スクリーンを追加する」を参照してください。

未加工アセット

HTML、JSON、ビデオなどの未加工のアセット ファイルは、プロジェクトの Resources\Raw フォルダーにドラッグすることでアプリ プロジェクトに追加できます。ここで、ビルド アクションは自動的に MauiAsset に設定されます。 これにより、プロジェクト ファイル内の資産ごとに対応するエントリが作成されます。

<MauiAsset Include="Resources\Raw\index.html" />

その後、必要に応じて、未加工アセットをコントロールで使用できます。

<WebView Source="index.html" />

ビルド時に、生アセットがアプリ パッケージにコピーされます。

CSS ファイル

.NET MAUI アプリは、カスケード スタイル シート (CSS) ファイルで部分的にスタイル設定できます。 CSS ファイルは、プロジェクトの任意のフォルダーにドラッグし、[プロパティ] ウィンドウでビルド アクションを にMauiCss設定することで、アプリ プロジェクトに追加できます。

CSS ファイルは、 に追加ResourceDictionaryする前に、 StyleSheet クラスによって読み込まれる必要があります。

<Application ...>
    <Application.Resources>
        <StyleSheet Source="/Resources/styles.css" />
    </Application.Resources>
</Application>

詳細については、「CSS を 使用したアプリのスタイル設定」を参照してください。

アプリ マニフェスト

各プラットフォームでは、独自のネイティブ アプリ マニフェスト ファイルを使用して、アプリのタイトル、ID、バージョンなどの情報を指定します。 .NET MAUI 単一プロジェクトを使用すると、この共通アプリ データをプロジェクト ファイル (.csproj) 内の 1 つの場所に指定できます。

プロジェクトの共有アプリ マニフェスト データを指定するには、ソリューション エクスプローラーでプロジェクトのショートカット メニューを開き、[プロパティ] を選択します。 その後、 MAUI Shared > General でアプリのタイトル、ID、バージョンを指定できます。

.NET MAUI アプリ マニフェストのスクリーンショット。

ビルド時に、共有アプリ マニフェスト データがネイティブ アプリ マニフェスト ファイル内のプラットフォーム固有のデータとマージされ、アプリ パッケージのマニフェスト ファイルが生成されます。 詳細については、「 .NET MAUI でのプロジェクト構成 - MAUI Shared」を参照してください。

プラットフォーム固有のコード

.NET MAUI アプリ プロジェクトには Platforms フォルダーが含まれています。各子フォルダーは、.NET MAUI がターゲットにできるプラットフォームを表します。

プラットフォーム フォルダーのスクリーンショット。

各プラットフォームのフォルダーには、プラットフォーム固有のリソースと、各プラットフォームでアプリを起動するコードが含まれています。

プラットフォーム固有のコードのスクリーンショット。

ビルド時、ビルド システムには、その特定のプラットフォーム用にビルドする際の各フォルダーからのコードのみが含まれます。 たとえば、Android 用にビルドする場合、 Platforms\Android フォルダー内のファイルはアプリ パッケージに組み込まれますが、他の Platforms フォルダー内のファイルは作成されません。 このアプローチでは、マルチターゲットを使用して、1 つのプロジェクトから複数のプラットフォームをターゲットにします。 マルチターゲットは、部分クラスと部分メソッドと組み合わせて、クロスプラットフォーム コードからネイティブ プラットフォーム機能を呼び出すことができます。 詳細については、「 プラットフォーム コードの呼び出し」を参照してください。

この既定のマルチターゲットアプローチに加えて、.NET MAUI アプリは、独自のファイル名とフォルダーの条件に基づいてマルチターゲット化することもできます。 これにより、プラットフォーム コードを Platforms フォルダーの子フォルダーに配置する必要がないように、.NET MAUI アプリ プロジェクトを構造化できます。 詳細については、「 マルチターゲットの構成」を参照してください。

マルチターゲットを条件付きコンパイルと組み合わせて、コードが特定のプラットフォームを対象とするようにすることもできます。

#if ANDROID
                  handler.NativeView.SetBackgroundColor(Colors.Red.ToNative());
#elif IOS
                  handler.NativeView.BackgroundColor = Colors.Red.ToNative();
                  handler.NativeView.BorderStyle = UIKit.UITextBorderStyle.Line;
#elif WINDOWS
                  handler.NativeView.Background = Colors.Red.ToNative();
#endif

条件付きコンパイルの詳細については、「 条件付きコンパイル」を参照してください。

アプリのエントリ ポイント

[プラットフォーム] フォルダーには、各プラットフォームでアプリを起動するプラットフォーム固有のコードが含まれていますが、.NET MAUI アプリには 1 つのクロスプラットフォーム アプリ エントリ ポイントがあります。 各プラットフォーム エントリ ポイントは、アプリ プロジェクトの静的MauiProgramクラスで メソッドを呼び出CreateMauiAppし、アプリのエントリ ポイントである を返MauiAppします。

クラスは MauiProgram 、少なくとも実行するアプリを提供する必要があります。

namespace MyMauiApp;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>();

        return builder.Build();
    }
}  

クラスは App 、 クラスから Application 派生します。

namespace MyMauiApp;

public class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }
}

前の例では、 MainPage プロパティは オブジェクトに AppShell 設定されています。 AppShell は、アプリのビジュアル階層を記述するサブクラス化された Shell クラスです。 詳細については、「 .NET MAUI Shell アプリを作成する」を参照してください。