UWP へのデスクトップ アプリケーションからの移動します。Move from a desktop application to UWP

.NET Framework (WPF と Windows フォームを含む) を使用して構築された既存のデスクトップ アプリケーションがある場合またはC++Win32 Api では、Windows 10 とユニバーサル Windows プラットフォーム (UWP) に移動するためのいくつかのオプションがあります。If you have an existing desktop application that was built using the .NET Framework (including WPF and Windows Forms) or C++ Win32 APIs, you have several options for moving to the Universal Windows Platform (UWP) and Windows 10.

MSIX パッケージ内のデスクトップ、アプリケーションをパッケージ化します。Package your desktop application in an MSIX package

Windows 10 の多数の機能へのアクセスを取得する MSIX パッケージをデスクトップ アプリケーションをパッケージ化することができます。You can package your desktop application in an MSIX package to get access to many more Windows 10 features. MSIX は、UWP、WPF、Windows フォーム、Win32 アプリを含む、あらゆる Windows アプリ用のユニバーサル パッケージ化エクスペリエンスを提供するモダンな Windows アプリ パッケージ形式です。MSIX is a modern Windows app package format that provides a universal packaging experience for all Windows apps, including UWP, WPF, Windows Forms and Win32 apps. MSIX パッケージにデスクトップ Windows アプリをパッケージ化することで、堅牢なインストール、更新エクスペリエンス、柔軟な機能システムによる管理されたセキュリティ モデル、Microsoft Store のサポート、エンタープライズ管理、および多くのカスタム配布モデルにアクセスできます。Packaging your desktop Windows apps in MSIX packages gets you access to a robust installation and updating experience, a managed security model with a flexible capability system, support for the Microsoft Store, enterprise management, and many custom distribution models. ソース コードがあるかどうか、またはのみ (MSI、または、APP-V のインストーラー) などの既存のインストーラー ファイルがあるかどうか、アプリケーションをパッケージ化することができます。You can package your application whether you have the source code or if you only have an existing installer file (such as an MSI or App-V installer). アプリケーションをパッケージ化したら、パッケージの拡張機能とその他の UWP コンポーネントなどの UWP 機能を統合できます。After you package your application, you can integrate UWP features such as package extensions and other UWP components.

詳細については、次を参照してください。デスクトップ アプリケーション (デスクトップ ブリッジ) パッケージパッケージ id が必要な機能します。For more information, see Package desktop applications (Desktop Bridge) and Features that require package identity.

UWP Api を使用して、Use UWP APIs

多くの UWP API を WPF、Windows フォーム、または C++ Win32 デスクトップ アプリで直接呼び出して、Windows 10 ユーザーの利便性を高めるモダン エクスペリエンスを統合できます。You can call many UWP APIs directly in your WPF, Windows Forms, or C++ Win32 desktop app to integrate modern experiences that light up for Windows 10 users. たとえば、UWP API を呼び出して、トースト通知をデスクトップ アプリに追加できます。For example, you can call UWP APIs to add toast notifications to your desktop app.

詳細については、「Use UWP APIs in desktop apps (デスクトップ アプリでの UWP API の使用)」を参照してください。For more information, see Use UWP APIs in desktop apps.

移行、.NET Framework アプリを UWP アプリMigrate a .NET Framework app to a UWP app

アプリケーションを .NET Framework で実行する場合は、.NET Standard 2.0 を利用して UWP アプリに移行することができます。If your application runs on the .NET Framework, you can migrate it to a UWP app by leveraging .NET Standard 2.0. .NET Standard 2.0 クラス ライブラリにことができますし、.NET Standard 2.0 ライブラリを参照する UWP アプリを作成すると、多くのコードに移動します。Move as much code as you can into .NET Standard 2.0 class libraries, and then create a UWP app that references your .NET Standard 2.0 libraries.

.NET Standard 2.0 ライブラリでコードを共有するShare code in a .NET Standard 2.0 library

.NET Framework でアプリケーションを実行する場合は、することができますに .NET Standard 2.0 クラス ライブラリのコードを配置します。If your application runs on the .NET Framework, place as much code as you can into .NET Standard 2.0 class libraries. 標準で定義されている API を使用しているコードは、UWP アプリで再利用できます。As long as your code uses APIs that are defined in the standard, you can reuse it in a UWP app. .NET Standard 2.0 に含まれる API が大幅に増えたため、.NET Standard ライブラリでのコード共有は、従来よりずっと簡単になっています。It's easier than it's ever been to share code in a .NET Standard library because so many more APIs are included in the .NET Standard 2.0.

詳細については、通知するビデオを次に示します。Here's a video that tells you more about it.

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

まず、1 つ以上の .NET Standard クラス ライブラリをソリューションに追加します。First, add one or more .NET Standard class libraries to your solution.

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

ソリューションに追加するライブラリの数は、計画しているコード編成によって異なります。The number of libraries that you add to your solution depends on how you plan to organize your code.

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

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

この設定には、クラス ライブラリ プロジェクトのプロパティ ページからアクセスできます。You can find this setting in the property pages of the class library project.

デスクトップ アプリケーション プロジェクトから、クラス ライブラリ プロジェクトへの参照を追加します。From your desktop application project, add a reference to the class library project.

クラス ライブラリ参照

次に、ツールを使用して、どの程度のコードが標準に準拠しているか調べます。Next, use tools to determine how much of your code conforms to the standard. これにより、コードをライブラリに移行する前に、どの部分を再利用でき、どの部分で最小限の変更が必要になり、どの部分がアプリケーション固有にしておくのかを決定できます。That way, before you move code into the library, you can decide which parts you can reuse, which parts require minimal modification, and which parts will remain application-specific.

ライブラリとコードの互換性を確認するCheck library and code compatibility

まず Nuget パッケージと、サード パーティから取得したその他の dll ファイルから始めます。We'll start with Nuget Packages and other dll files that you obtained from a third party.

アプリケーションでこれらを使用する場合は、.NET Standard 2.0 と互換性があるかどうかを確認します。If your application uses any of them, determine if they are compatible with the .NET Standard 2.0. そのためには、Visual Studio 拡張機能またはコマンド ライン ユーティリティを使用できます。You can use a Visual Studio extension or a command-line utility to do that.

これらの同じツールを使用して、コードを分析します。Use these same tools to analyze your code. ここでツール (dotnet apiport) をダウンロードし、使用方法に関するビデオをご覧ください。Download the tools here (dotnet-apiport) and then watch this video to learn how to use them.   

コードに標準との互換性がない場合は、そのコードを実装するための他の方法を検討してください。If your code isn't compatible with the standard, consider other ways that you could implement that code. まず .NET API ブラウザーを開きます。Start by opening the .NET API Browser. このブラウザーを使用して、.NET Standard 2.0 に含まれている API を確認します。You can use that browser to review the API's that are available in the .NET Standard 2.0. 一覧の範囲として .NET Standard 2.0 を指定してください。Make sure to scope the list to the .NET Standard 2.0.

.NET オプション

コードの一部はプラットフォーム固有でありデスクトップ アプリケーション プロジェクト内に残す必要があります。Some of your code will be platform-specific and will need to remain in your desktop application project.

以下に例を示します.NET Standard 2.0 ライブラリへのデータ アクセス コードの移行Example: Migrating data access code to a .NET Standard 2.0 library

Northwind サンプル データベースから顧客を表示する非常に基本的な Windows フォーム アプリケーションがあると仮定します。Let's assume that we have a very basic Windows Forms application that shows customers from our Northwind sample database.

Windows フォーム アプリ

このプロジェクトには、.NET Standard 2.0 クラス ライブラリおよび Northwind という静的クラスが含まれています。The project contains a .NET Standard 2.0 class library with a static class named Northwind. このコードでは SQLConnection クラス、SqlCommand クラス、SqlDataReader クラスが使用されており、これらのクラスが .NET Standard 2.0 にないため、Northwind クラスに移行してもコンパイルできません。If we move this code into the Northwind class, it won't compile because it uses the SQLConnection, SqlCommand, and SqlDataReader classes, and those classes that are not available in the .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 ブラウザーを使用して代わりのクラスを見つけることができます。We can use the .NET API Browser to find an alternative though. DbConnectionDbCommandDbDataReader の各クラスはすべて .NET Standard 2.0 で利用可能であるため、それらを代わりに使用することができます。The DbConnection, DbCommand, and DbDataReader classes are all available in the .NET Standard 2.0 so we can use them instead.

この改訂バージョンではこれらのクラスを使用して顧客の一覧を取得しますが、DbConnection クラスを作成するには、クライアント アプリケーションで作成するファクトリ オブジェクトを渡す必要があります。This revised version uses those classes to get a list of customers, but to create a DbConnection class, we'll need to pass in a factory object that we create in the client application.

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 フォームの分離コード ページでは、ファクトリ インスタンスを作成しメソッドに渡すことができます。In the code-behind page of the Windows Form, we can just create factory instance and pass it into our method.

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 アプリを作成します。Create a UWP app

これで、ソリューションに UWP アプリを追加する準備ができました。Now you're ready to add a UWP app to your solution.

Desktop to UWP Bridge のイメージ

UI ページは XAML で設計し、デバイス固有またはプラットフォーム固有のコードも記述する必要がありますが、完了すると、すべての Windows 10 デバイスをターゲットにすることができます。アプリ ページはさまざまな画面サイズや解像度に合わせて調整されるモダンな使用感になります。You'll still have to design UI pages in XAML and write any device or platform-specific code, but when you are done, you'll be able to reach the full breadth of Windows 10 devices and your app pages will have a modern feel that adapts well to different screen sizes and resolutions.

アプリはキーボードとマウスだけではなく、他の入力メカニズムにも応答し、さまざまなデバイスで直感的に機能や設定を使用できます。Your app will respond to input mechanisms other than just a keyboard and mouse, and features and settings will be intuitive across devices. つまり、ユーザーが操作方法を 1 回だけ学習すると、デバイスに関係なく慣れた方法で操作できます。This means that users learn how to do things one time, and then it works in a very familiar way no matter the device.

これらは、UWP による利点のごく一部です。These are just a few of the goodies that come with UWP. 詳しくは、「Windowsで優れたエクスペリエンスを実現」をご覧ください。To learn more, see Build great experiences with Windows.

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

まず、UWP プロジェクトをソリューションに追加します。First, add a UWP project to your solution.

UWP プロジェクト

次に、UWP プロジェクトから、.NET Standard 2.0 ライブラリ プロジェクトへの参照を追加します。Then, from your UWP project, add a reference the .NET Standard 2.0 library project.

クラス ライブラリ参照

ページをビルドするBuild your pages

XAML ページを追加し、.NET Standard 2.0 ライブラリ内のコードを呼び出します。Add XAML pages and call the code in your .NET Standard 2.0 library.

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 アプリとは」をご覧ください。To get started with UWP, see What's a UWP app.

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

Xamarin プロジェクトを追加することにより、Android デバイスと iOS デバイスをターゲットにすることができます。You can reach Android and iOS devices by adding Xamarin projects.

Xamarin アプリ

これらのプロジェクトでは、C# でプラットフォーム固有およびデバイスに固有の API へのフル アクセスを使用して、Android アプリと iOS アプリを構築できます。These projects let you use C# to build Android and iOS apps with full access to platform-specific and device-specific APIs. これらのアプリはプラットフォーム固有のハードウェア アクセラレーションを利用し、ネイティブ パフォーマンス用にコンパイルできます。These apps leverage platform-specific hardware acceleration, and are compiled for native performance.

これらのアプリでは、iBeacons や Android フラグメントなどのプラットフォーム固有機能を含めて、基盤となるプラットフォームおよびデバイスによって公開される機能に全面的にアクセスできます。標準のネイティブ ユーザー インターフェイス コントロールを使用すると、ユーザーが期待する外観と操作感の UI を構築できます。They have access to the full spectrum of functionality exposed by the underlying platform and device, including platform-specific capabilities like iBeacons and Android Fragments and you'll use standard native user interface controls to build UIs that look and feel the way that users expect them to.

UWP の場合と同様、.NET Standard 2.0 クラス ライブラリに用意されているビジネス ロジックを再利用できるため、Android アプリまたは iOS アプリを追加するコストが低くなります。Just like UWPs, the cost to add an Android or iOS app is lower because you can reuse business logic in a .NET Standard 2.0 class library. UI ページは XAML で設計し、デバイス固有またはプラットフォーム固有のコードを記述する必要があります。You'll have to design your UI pages in XAML and write any device or platform-specific code.

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

まず、AndroidiOS、またはクロス プラットフォームのプロジェクトをソリューションに追加します。First, add an Android, iOS, or Cross-Platform project to your solution.

これらのテンプレートは、 [新しいプロジェクトの追加] ダイアログ ボックスの [Visual C#] グループにあります。You can find these templates in the Add New Project dialog box under the Visual C# group.

Xamarin アプリ

注意

クロスプラット フォーム プロジェクトは、プラットフォーム固有の機能がほとんどないアプリに最適です。Cross-platform projects are great for apps with little platform-specific functionality. これらを使用して、iOS、Android、および Windows で実行されるネイティブの XAML ベース UI を 1 つ構築できます。You can use them to build one native XAML-based UI that runs on iOS, Android, and Windows. こちらをご覧ください。Learn more here.

次に、Android、iOS、またはクロスプラットフォーム プロジェクトから、クラス ライブラリ プロジェクトの参照を追加します。Then, from your Android, iOS, or cross-platform project, add a reference the class library project.

クラス ライブラリ参照

ページをビルドするBuild your pages

この例では、Android アプリに顧客の一覧が示されます。Our example shows a list of customers in an Android app.

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 開発者ポータルをご覧ください。To get started with Android, iOS, and cross-platform projects, see the Xamarin developer portal.

次のステップNext steps

質問の回答を検索Find answers to your questions

ご質問がある場合は、Have questions? Stack Overflow でお問い合わせください。Ask us on Stack Overflow. Microsoft のチームでは、これらのタグをチェックしています。Our team monitors these tags. こちらから質問することもできます。You can also ask us here.

ご意見や機能を提案します。Give feedback or make feature suggestions

UserVoice のページをご覧ください。See UserVoice.