次の方法で共有


デスクトップ アプリケーションから 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 を必要とする Features」を参照してください

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 クラス ライブラリをソリューションに追加します。

dotnet 標準プロジェクトを追加する

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

各クラス ライブラリが .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 に設定してください。

dot net オプション

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

例: .NET Standard 2.0 ライブラリへのデータ アクセス コードの移行

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

Windows フォーム アプリ

プロジェクトには、.NET Standard 2.0 クラス ライブラリと、 Northwind という名前の静的クラスが含まれています。 このコードを Northwind クラスに移動すると、 SQLConnectionSqlCommandSqlDataReader クラス、および .NET Standard 2.0 で使用できないクラスが使用されるため、コンパイルされません。

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 ブラウザー を使用して代替手段を見つけることができます。 DbConnectionDbCommand、およびDbDataReaderクラスはすべて .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 アプリを追加する準備ができました。

デスクトップから UWP へのブリッジ イメージ

それでも、XAML で UI ページを設計し、デバイスまたはプラットフォーム固有のコードを記述する必要がありますが、完了すると、Windows 10 デバイスと Windows 11 デバイスの幅が広がり、アプリ ページはさまざまな画面サイズと解像度に適応する最新の操作性を備えます。

アプリはキーボードとマウス以外の入力メカニズムに応答し、機能と設定はデバイス間で直感的になります。 つまり、ユーザーは一度何かを行う方法を学習し、デバイスに関係なく非常に使い慣れた方法で動作します。

これらは、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 デバイスにアクセスできます。

Note

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

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

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

iBeacons や Android Fragments などのプラットフォーム固有の機能など、基になるプラットフォームとデバイスによって公開される機能の全範囲にアクセスできます。また、標準のネイティブ ユーザー インターフェイス コントロールを使用して、ユーザーが期待する外観の UI を構築します。

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

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

まず、ソリューションに AndroidiOS、または Cross-Platform プロジェクトを追加します。

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

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

Note

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

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

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

ページを作成する

この例では、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 のチームでは、これらのタグをチェックしています。 こちらから質問することもできます。