Share via


デスクトップ アプリケーションから UWP への移行

.NET Framework (WPF とWindows フォームを含む) または C++ Win32 API を使用してビルドされた既存のデスクトップ アプリケーションがある場合は、ユニバーサル Windows プラットフォーム (UWP) と Windows 10/11 に移行するためのいくつかのオプションがあります。

デスクトップ アプリケーションを MSIX パッケージにパッケージ化する

デスクトップ アプリケーションを MSIX パッケージにパッケージ化して、より多くのWindows 10およびWindows 11機能にアクセスできます。 MSIX は、UWP、WPF、Windows フォーム、Win32 アプリを含む、あらゆる Windows アプリ用のユニバーサル パッケージ化エクスペリエンスを提供するモダンな Windows アプリ パッケージ形式です。 MSIX パッケージにデスクトップ Windows アプリをパッケージ化することで、堅牢なインストール、更新エクスペリエンス、柔軟な機能システムによる管理されたセキュリティ モデル、Microsoft Store のサポート、エンタープライズ管理、および多くのカスタム配布モデルにアクセスできます。 ソース コードがある場合でも、既存のインストーラー ファイル (MSI や App-V インストーラーなど) のみを持っている場合でも、アプリケーションをパッケージ化できます。 アプリケーションをパッケージ化した後、パッケージ拡張機能や他の UWP コンポーネントなどの UWP 機能を統合できます。

詳細については、「 コードからの MSIX パッケージのビルド 」および「 パッケージ ID を必要とする機能」を参照してください。

Windows ランタイム API を使用する

多くの Windows ランタイム API を WPF、Windows フォーム、または C++ Win32 デスクトップ アプリで直接呼び出して、Windows 10 ユーザーの利便性を高めるモダン エクスペリエンスを統合できます。 たとえば、Windows ランタイム API を呼び出して、トースト通知をデスクトップ アプリに追加できます。

詳しくは、デスクトップ アプリでの Windows ランタイム API の使用に関する記事をご覧ください。

.NET Framework アプリを UWP アプリに移行する

アプリケーションが .NET Framework で実行されている場合は、.NET Standard 2.0 を利用することで、そのアプリを UWP アプリに移行できます。 可能な限り多くのコードを .NET Standard 2.0 クラス ライブラリに移行し、.NET Standard 2.0 ライブラリを参照する UWP アプリを作成します。

.NET Standard 2.0 ライブラリでコードを共有する

アプリケーションが .NET Framework で実行されている場合は、できる限り多くのコードを .NET Standard 2.0 クラス ライブラリに配置します。 標準で定義されている API を使用しているコードは、UWP アプリで再利用できます。 .NET Standard 2.0 に含まれる API が大幅に増えたため、.NET Standard ライブラリでのコード共有は、従来よりずっと簡単になっています。

詳しい解説は、こちらのビデオでご覧ください。

.NET Standard ライブラリを追加する

まず、1 つ以上の .NET Standard クラス ライブラリをソリューションに追加します。

.NET Standard プロジェクトの追加

ソリューションに追加するライブラリの数は、計画しているコード編成によって異なります。

各クラス ライブラリのターゲットが .NET Standard 2.0 になっていることを確認してください。

.NET Standard 2.0 をターゲットにする

この設定には、クラス ライブラリ プロジェクトのプロパティ ページからアクセスできます。

デスクトップ アプリケーション プロジェクトから、クラス ライブラリ プロジェクトへの参照を追加します。

ドット NET プロジェクトのクラス ライブラリ 参照を呼び出す [ソリューション エクスプローラー] ペインのスクリーンショット。

次に、ツールを使用して、どの程度のコードが標準に準拠しているか調べます。 これにより、コードをライブラリに移行する前に、どの部分を再利用でき、どの部分で最小限の変更が必要になり、どの部分がアプリケーション固有にしておくのかを決定できます。

ライブラリとコードの互換性を確認する

まず Nuget パッケージと、サード パーティから取得したその他の dll ファイルから始めます。

アプリケーションでこれらを使用する場合は、.NET Standard 2.0 と互換性があるかどうかを確認します。 そのためには、Visual Studio 拡張機能またはコマンド ライン ユーティリティを使用できます。

これらの同じツールを使用して、コードを分析します。 ここでツール (dotnet apiport) をダウンロードし、使用方法に関するビデオをご覧ください。  

コードに標準との互換性がない場合は、そのコードを実装するための他の方法を検討してください。 まず .NET API ブラウザーを開きます。 このブラウザーを使用して、.NET Standard 2.0 に含まれている API を確認します。 一覧の範囲として .NET Standard 2.0 を指定してください。

.NET オプション

コードの一部はプラットフォーム固有でありデスクトップ アプリケーション プロジェクト内に残す必要があります。

例: .NET Standard 2.0 ライブラリにデータ アクセス コードを移行する

Northwind のサンプル データベースに含まれる顧客を表示する基本的な Windows フォーム アプリケーションがあると仮定します。

Windows フォーム アプリ

このプロジェクトには、.NET Standard 2.0 クラス ライブラリおよび Northwind という静的クラスが含まれています。 このコードでは SQLConnection クラス、SqlCommand クラス、SqlDataReader クラスが使用されており、これらのクラスが .NET Standard 2.0 にないため、Northwind クラスに移行してもコンパイルできません。

public static ArrayList GetCustomerNames()
{
    ArrayList customers = new ArrayList();

    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString =
            @"Data Source=" +
            @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        SqlCommand command = new SqlCommand("select ContactName from customers order by ContactName asc", conn);

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

ただし、.NET API ブラウザーを使用して代わりのクラスを見つけることができます。 DbConnectionDbCommandDbDataReader の各クラスはすべて .NET Standard 2.0 で利用可能であるため、それらを代わりに使用することができます。

この改訂バージョンではこれらのクラスを使用して顧客の一覧を取得しますが、DbConnection クラスを作成するには、クライアント アプリケーションで作成するファクトリ オブジェクトを渡す必要があります。

public static ArrayList GetCustomerNames(DbProviderFactory factory)
{
    ArrayList customers = new ArrayList();

    using (DbConnection conn = factory.CreateConnection())
    {
        conn.ConnectionString = @"Data Source=" +
                        @"<Your Server Name>\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI";

        conn.Open();

        DbCommand command = factory.CreateCommand();
        command.Connection = conn;
        command.CommandText = "select ContactName from customers order by ContactName asc";

        using (DbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                customers.Add(reader[0]);
            }
        }
    }

    return customers;
}

Windows フォームの分離コード ページでは、ファクトリ インスタンスを作成しメソッドに渡すことができます。

public partial class Customers : Form
{
    public Customers()
    {
        InitializeComponent();

        dataGridView1.Rows.Clear();

        SqlClientFactory factory = SqlClientFactory.Instance;

        foreach (string customer in Northwind.GetCustomerNames(factory))
        {
            dataGridView1.Rows.Add(customer);
        }
    }
}

UWP アプリの作成

これで、ソリューションに UWP アプリを追加する準備ができました。

Desktop to UWP Bridge のイメージ

XAML で UI ページをデザインし、デバイスまたはプラットフォーム固有のコードを記述する必要はありますが、完了すると、Windows 10デバイスとWindows 11デバイスの全範囲に到達でき、アプリ ページはさまざまな画面サイズや解像度に合わせてモダンな雰囲気を持つようになります。

アプリはキーボードとマウスだけではなく、他の入力メカニズムにも応答し、さまざまなデバイスで直感的に機能や設定を使用できます。 つまり、ユーザーが操作方法を 1 回だけ学習すると、デバイスに関係なく慣れた方法で操作できます。

これらは、UWP による利点のごく一部です。 詳しくは、「Windowsで優れたエクスペリエンスを実現」をご覧ください。

UWP プロジェクトを追加する

まず、UWP プロジェクトをソリューションに追加します。

UWP プロジェクト

次に、UWP プロジェクトから、.NET Standard 2.0 ライブラリ プロジェクトへの参照を追加します。

ドット NET プロジェクトのクラス ライブラリ 参照への参照を呼び出す UWP ソリューション エクスプローラー ペインのスクリーンショット。

ページをビルドする

XAML ページを追加し、.NET Standard 2.0 ライブラリ内のコードを呼び出します。

UWP アプリ

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel x:Name="customerStackPanel">
        <ListView x:Name="customerList"/>
    </StackPanel>
</Grid>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        SqlClientFactory factory = SqlClientFactory.Instance;

        customerList.ItemsSource = Northwind.GetCustomerNames(factory);
    }
}

UWP を使い始めるには、「UWP アプリとは」をご覧ください。

iOS および Android デバイスへのリーチ

Xamarin プロジェクトを追加することにより、Android デバイスと iOS デバイスをターゲットにすることができます。

注意

新しいクロスプラットフォーム プロジェクトの場合は、.NET MAUI の使用を検討してください。

Xamarin アプリを表示する Android デバイスと i O S デバイスを示す画像。

これらのプロジェクトでは、C# でプラットフォーム固有およびデバイスに固有の API へのフル アクセスを使用して、Android アプリと iOS アプリを構築できます。 これらのアプリはプラットフォーム固有のハードウェア アクセラレーションを利用し、ネイティブ パフォーマンス用にコンパイルできます。

これらのアプリでは、iBeacons や Android フラグメントなどのプラットフォーム固有機能を含めて、基盤となるプラットフォームおよびデバイスによって公開される機能に全面的にアクセスできます。標準のネイティブ ユーザー インターフェイス コントロールを使用すると、ユーザーが期待する外観と操作感の UI を構築できます。

UWP の場合と同様、.NET Standard 2.0 クラス ライブラリに用意されているビジネス ロジックを再利用できるため、Android アプリまたは iOS アプリを追加するコストが低くなります。 UI ページは XAML で設計し、デバイス固有またはプラットフォーム固有のコードを記述する必要があります。

Xamarin プロジェクトを追加する

まず、AndroidiOS、またはクロス プラットフォームのプロジェクトをソリューションに追加します。

これらのテンプレートは、[新しいプロジェクトの追加] ダイアログ ボックスの [Visual C#] グループにあります。

[Add New Project]\(新しいプロジェクトの追加\) ダイアログ ボックスのスクリーンショット。[Installed Visual C]\(Visual C のインストール\) が選択され > 、Android、Cross Platform、i O S オプションが強調表示されています。

注意

クロスプラット フォーム プロジェクトは、プラットフォーム固有の機能がほとんどないアプリに最適です。 これらを使用して、iOS、Android、および Windows で実行されるネイティブの XAML ベース UI を 1 つ構築できます。 こちらをご覧ください。

次に、Android、iOS、またはクロスプラットフォーム プロジェクトから、クラス ライブラリ プロジェクトの参照を追加します。

Android、i OS、またはクロスプラットフォーム プロジェクトのクラス ライブラリ 参照への参照を呼び出す [ソリューション エクスプローラー] ペインのスクリーンショット。

ページをビルドする

この例では、Android アプリに顧客の一覧が示されます。

Android アプリ

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" android:textSize="16sp"
    android:id="@android:id/list">
</TextView>
[Activity(Label = "MyAndroidApp", MainLauncher = true)]
public class MainActivity : ListActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        SqlClientFactory factory = SqlClientFactory.Instance;

        var customers = (string[])Northwind.GetCustomerNames(factory).ToArray(typeof(string));

        ListAdapter = new ArrayAdapter<string>(this, Resource.Layout.list_item, customers);
    }
}

Android プロジェクト、iOS プロジェクト、およびクロスプラットフォーム プロジェクトの概要については、Xamarin 開発者ポータルをご覧ください。

次の手順

質問に対する回答を見つける

ご質問があるでしょうか。 Stack Overflow でお問い合わせください。 Microsoft のチームでは、これらのタグをチェックしています。 こちらから質問することもできます。