Windows ランタイム 8.x プロジェクトの UWP プロジェクトへの移植Porting a Windows Runtime 8.x project to a UWP project

移植プロセスを開始するとき、2 つの方法から選ぶことができます。You have two options when you begin the porting process. 1 つは、既にあるプロジェクト ファイル (アプリ パッケージ マニフェストなど) のコピーを編集する方法です。この方法については、「アプリをユニバーサル Windows プラットフォーム (UWP) へ移行する」に記載されているプロジェクト ファイルの更新に関する説明をご覧ください。One is to edit a copy of your existing project files, including the app package manifest (for that option, see the info about updating your project files in Migrate apps to the Universal Windows Platform (UWP)). その他のオプションでは、Visual Studio で新しい Windows 10 プロジェクトを作成し、ファイルをコピーします。The other option is to create a new Windows 10 project in Visual Studio and copy your files into it. このトピックの最初のセクションでは、2 番目の方法について説明しますが、トピックの他の部分では、両方の方法に適用できる追加情報について説明します。The first section in this topic describes that second option, but the rest of the topic has additional info applicable to both options. 既存のプロジェクトと同じソリューションに新しい Windows 10 プロジェクトを保持し、共有プロジェクトを使用してソース コード ファイルを共有することもできます。You can also choose to keep your new Windows 10 project in the same solution as your existing projects and share source code files using a shared project. また、新しいプロジェクトを独自のソリューションに保持しておき、Visual Studio のリンク ファイル機能を使ってソース コード ファイルを共有することもできます。Or, you can keep the new project in a solution of its own and share source code files using the linked files feature in Visual Studio.

プロジェクトを作成し、ファイルをコピーするCreate the project and copy files to it

次の手順は、Visual Studio で新しい Windows 10 プロジェクトを作成し、ファイルをコピーするオプションに注目します。These steps focus on the option to create a new Windows 10 project in Visual Studio and copy your files into it. 作成するプロジェクトの数およびコピーするファイルに関する一部の仕様は、「ユニバーサル 8.1 アプリがある場合」や、それに続くセクションで説明されている要因と決定事項によって異なります。Some of the specifics around how many projects you create, and which files you copy over, will depend on the factors and decisions described in If you have a Universal 8.1 app and the sections that follow it. 次の手順では、最もシンプルなケースを前提としています。These steps assume the simplest case.

  1. Microsoft Visual Studio 2015 を起動し、新しい空のアプリケーション (ユニバーサル Windows) プロジェクトを作成します。Launch Microsoft Visual Studio 2015 and create a new Blank Application (Windows Universal) project. 詳細については、次を参照してください。 Jumpstart、Windows ランタイム 8.x アプリのテンプレートを使用して (C#、C++、Visual Basic)します。For more info, see Jumpstart your Windows Runtime 8.x app using templates (C#, C++, Visual Basic). 新しいプロジェクトによって、すべてのデバイス ファミリで実行される 1 つのアプリ パッケージ (appx ファイル) が構築されます。Your new project builds an app package (an appx file) that will run on all device families.
  2. ユニバーサル 8.1 アプリ プロジェクトで、再利用するすべてのソース コード ファイルとビジュアル アセット ファイルを確認します。In your Universal 8.1 app project, identify all the source code files and visual asset files that you want to reuse. エクスプローラーを使って、データ モデル、ビュー モデル、ビジュアル アセット、リソース ディクショナリ、フォルダー構造、および再利用するその他すべての要素を、新しいプロジェクトにコピーします。Using File Explorer, copy data models, view models, visual assets, Resource Dictionaries, folder structure, and anything else that you wish to re-use, to your new project. 必要に応じて、ディスクにサブフォルダーをコピーするか、作成します。Copy or create sub-folders on disk as necessary.
  3. 新しいプロジェクトに、ビュー (たとえば MainPage.xaml、MainPage.xaml.cs など) もコピーします。Copy views (for example, MainPage.xaml and MainPage.xaml.cs) into the new project, too. ここでも、必要に応じて新しいサブフォルダーを作成し、プロジェクトから既にあるビューを削除します。Again, create new sub-folders as necessary, and remove the existing views from the project. ただし、Visual Studio が生成したビューを上書きまたは削除する前に、後で参照するときに役立つ場合があるため、コピーを保存しておきます。But, before you over-write or remove a view that Visual Studio generated, keep a copy because it may be useful to refer to it later. ユニバーサル 8.1 アプリを移植する最初のフェーズでは、1 つのデバイス ファミリでアプリが適切に表示され機能することを重視します。The first phase of porting a Universal 8.1 app focuses on getting it to look good and work well on one device family. その後で、すべてのフォーム ファクターに対してビューを適切に対応させることに重点を置きます。必要に応じて、特定のデバイス ファミリを最大限に活用できるように、アダプティブ コードを追加します。Later, you'll turn your attention to making sure the views adapt themselves well to all form factors, and optionally to adding any adaptive code to get the most from a particular device family.
  4. ソリューション エクスプローラーで、 [すべてのファイルを表示] がオンであることを確認します。In Solution Explorer, make sure Show All Files is toggled on. コピーしたファイルを選択して右クリックし、 [プロジェクトに含める] をクリックします。Select the files that you copied, right-click them, and click Include In Project. これによって、含まれるフォルダーが自動的に取り込まれます。This will automatically include their containing folders. 後で必要に応じて、 [すべてのファイルを表示] をオフに切り替えることができます。You can then toggle Show All Files off if you like. 代替ワークフローとして、 [既存項目の追加] コマンドを使って Visual Studio ソリューション エクスプローラーで必要なすべてのサブフォルダーを作成することもできます。An alternative workflow, if you prefer, is to use the Add Existing Item command, having created any necessary sub-folders in the Visual Studio Solution Explorer. ビジュアル アセットで、 [ビルド アクション][コンテンツ] に設定されており、 [出力ディレクトリにコピー][コピーしない] に設定されていることを確認します。Double-check that your visual assets have Build Action set to Content and Copy to Output Directory set to Do not copy.
  5. この段階では、ビルド エラーが発生する可能性があります。You are likely to see some build errors at this stage. ただし、どのような変更が必要であるかを理解している場合は、Visual Studio の [検索と置換] コマンドを使って、ソース コードに対して一括変更を実行できます。また Visual Studio の命令型コード エディターで、コンテキスト メニューの [解決] コマンドと [using の整理] コマンドを使って、よりターゲットを絞った変更を実行することもできます。But, if you know what you need to change, then you can use Visual Studio's Find and Replace command to make bulk changes to your source code; and in the imperative code editor in Visual Studio, use the Resolve and Organize Usings commands on the context menu for more targeted changes.

マークアップとコードを最大限に再利用するMaximizing markup and code reuse

若干のリファクタリングを行い、アダプティブ コード (後で説明します) を追加することで、すべてのデバイス ファミリで動作するマークアップとコードを最大限に活用することができます。You will find that refactoring a little, and/or adding adaptive code (which is explained below), will allow you to maximize the markup and code that works across all device families. 詳しい説明を次に示します。Here are more details.

  • すべてのデバイス ファミリに共通するファイルについては、特に考慮する必要はありません。Files that are common to all device families need no special consideration. これらのファイルは、実行対象となるすべてのデバイス ファミリで、アプリが使うファイルです。Those files will be used by the app on all the device families that it runs on. これには、XAML マークアップ ファイル、命令型ソース コード ファイル、アセット ファイルが含まれます。This includes XAML markup files, imperative source code files, and asset files.
  • 実行されているデバイス ファミリをアプリで検出し、そのデバイス ファミリ専用に設計されたビューに移動させることができます。It is possible for your app to detect the device family that it is running on and navigate to a view that has been designed specifically for that device family. 詳しくは、「アプリが実行されているプラットフォームの検出」をご覧ください。For more details, see Detecting the platform your app is running on.
  • プラットフォームを検出するための代替方法がない場合に役立つと考えられる同様の手法として、マークアップ ファイルや ResourceDictionary ファイル (またはこのファイルが保存されているフォルダー) に対して特殊な名前を設定する方法があります。この特殊な名前によって、アプリが特定のデバイス ファミリで実行される場合にのみ、これらのファイルが実行時に自動的に読み込まれるようになります。A similar technique that you may find useful if there is no alternative is give a markup file or ResourceDictionary file (or the folder that contains the file) a special name such that it is automatically loaded at runtime only when your app runs on a particular device family. この手法については、「Bookstore1」のケース スタディをご覧ください。This technique is illustrated in the Bookstore1 case study.
  • Windows 10 をサポートするためにのみ必要がある場合は、8.1 ユニバーサル アプリのソース コードで、多くの条件付きコンパイル ディレクティブを削除する必要があります。You should be able to remove a lot of the conditional compilation directives in your Universal 8.1 app's source code if you only need to support Windows 10. このトピックの「条件付きコンパイルとアダプティブ コード」をご覧ください。See Conditional compilation and adaptive code in this topic.
  • 一部のデバイス ファミリでのみ利用できる機能 (プリンター、スキャナー、またはカメラのボタンなど) を使うには、アダプティブ コードを記述します。To use features that are not available on all device families (for example, printers, scanners, or the camera button), you can write adaptive code. このトピックの「条件付きコンパイルとアダプティブ コード」に記載されている 3 番目の例をご覧ください。See the third example in Conditional compilation and adaptive code in this topic.
  • コード型の Windows 8.1、Windows Phone 8.1、および Windows 10 をサポートする場合は、同じソリューション内の 3 つのプロジェクトのまま共有プロジェクトでコードを共有したりできます。If you want to support Windows 8.1, Windows Phone 8.1, and Windows 10, then you can keep three projects in the same solution and share code with a Shared project. または、プロジェクト間でソース コード ファイルを共有することができます。Alternatively, you can share source code files between projects. Visual Studio でこのような処理を行うには、ソリューション エクスプローラーでプロジェクトを右クリックして [既存項目の追加] を選択し、共有するファイルを選択して [リンクとして追加] をクリックします。Here's how: in Visual Studio, right-click the project in Solution Explorer, select Add Existing Item, select the files to share, and then click Add As Link. リンクしたプロジェクトを確認できるファイル システム上の共通のフォルダーにソース コード ファイルを格納します。Store your source code files in a common folder on the file system where the projects that link to them can see them. また、ソース コントロールに追加することを忘れないでください。And don't forget to add them to source control.
  • ソース コード レベルではなくバイナリ レベルでの再利用については、「C# および Visual Basic での Windows ランタイム コンポーネントの作成」をご覧ください。For reuse at the binary level, rather than the source code level, see Creating Windows Runtime Components in C# and Visual Basic. ポータブル クラス ライブラリでは、Windows 8.1、Windows Phone 8.1、および Windows 10 アプリ (.NET Core) の .NET Framework と完全な .NET Framework で利用できる .NET Api のサブセットのサポートもあります。There are also Portable Class Libraries, which support the subset of .NET APIs that are available in the .NET Framework for Windows 8.1, Windows Phone 8.1, and Windows 10 apps (.NET Core), and the full .NET Framework. ポータブル クラス ライブラリ アセンブリは、これらのプラットフォームすべてとバイナリ レベルで互換性があります。Portable Class Library assemblies are binary compatible with all these platforms. Visual Studio を使って、ポータブル クラス ライブラリをターゲットとするプロジェクトを作成します。Use Visual Studio to create a project that targets a Portable Class Library. 汎用性のあるクラス ライブラリを使用したプラットフォーム間の開発」をご覧ください。See Cross-Platform Development with the Portable Class Library.

拡張 SDKExtension SDKs

ユニバーサル 8.1 アプリによって呼び出されている Windows ランタイム API のほとんどは、ユニバーサル デバイス ファミリと呼ばれる API のセットに実装されています。Most of the Windows Runtime APIs your Universal 8.1 app already calls are implemented in the set of APIs known as the universal device family. ただし、一部の API は拡張 SDK に実装されており、Visual Studio で認識されるのは、アプリのターゲット デバイス ファミリによって実装された API、または参照している拡張 SDK によって実装された API のみです。But, some are implemented in extension SDKs, and Visual Studio only recognizes APIs that are implemented by your app's target device family or by any extension SDKs that you have referenced.

検出できなかった名前空間、型、メンバーについてのコンパイル エラーが発生した場合は、上記のことが原因となる可能性があります。If you get compile errors about namespaces or types or members that could not be found, then this is likely to be the cause. API リファレンス ドキュメントで API のトピックを表示し、要件に関するセクションに移動します。このセクションでは、どのようなデバイス ファミリが API を実装するかが示されています。Open the API's topic in the API reference documentation and navigate to the Requirements section: that will tell you what the implementing device family is. ターゲット デバイス ファミリが示されていない場合は、プロジェクトで API を利用できるようにするために、そのデバイス ファミリ用の拡張 SDK に対する参照が必要になります。If that's not your target device family, then to make the API available to your project, you will need a reference to the extension SDK for that device family.

をクリックしてプロジェクト > 参照の追加 > Windows Universal > 拡張と適切な拡張機能 SDK を選択します。Click Project > Add Reference > Windows Universal > Extensions and select the appropriate extension SDK. たとえば、呼び出す API がモバイル デバイス ファミリでのみ利用可能であり、それらの API がバージョン 10.0.x.y で導入されている場合は、 [Windows Mobile Extensions for the UWP] を選びます。For example, if the APIs you want to call are available only in the mobile device family, and they were introduced in version 10.0.x.y, then select Windows Mobile Extensions for the UWP.

これにより、次の参照がプロジェクト ファイルに追加されます。That will add the following reference to your project file:

<ItemGroup>
    <SDKReference Include="WindowsMobile, Version=10.0.x.y">
        <Name>Windows Mobile Extensions for the UWP</Name>
    </SDKReference>
</ItemGroup>

名前とバージョン番号は、SDK がインストールされている場所にあるフォルダーと一致します。The name and version number match the folders in the installed location of your SDK. たとえば、上記の情報は次のフォルダー名と一致します。For example, the above information matches this folder name:

\Program Files (x86)\Windows Kits\10\Extension SDKs\WindowsMobile\10.0.x.y

API を実装するデバイス ファミリがアプリのターゲットではない場合は、ApiInformation クラスを使って、API を呼び出す前に API の有無をテストする必要があります (これはアダプティブ コードと呼ばれます)。Unless your app targets the device family that implements the API, you'll need to use the ApiInformation class to test for the presence of the API before you call it (this is called adaptive code). このテストの条件は、アプリの実行時に必ず評価されますが、API が存在するデバイスに対してのみ true と評価され、呼び出しが可能になります。This condition will then be evaluated wherever your app runs, but it will only evaluate to true on devices where the API is present and therefore available to call. ユニバーサル API が存在するかどうかを最初に確認した後では、拡張 SDK とアダプティブ コードのみを使います。Only use extension SDKs and adaptive code after first checking whether a universal API exists. 次のセクションで、例をいくつか示します。Some examples are given in the section below.

アプリ パッケージ マニフェスト」もご覧ください。Also, see App package manifest.

条件付きコンパイルとアダプティブ コードConditional compilation and adaptive code

条件付きコンパイルを使用している場合 (でC#プリプロセッサ ディレクティブ)、コード ファイルは、Windows 8.1 と Windows Phone 8.1 の両方で作業、ようにし、確認できます Windows 10 で実行された収束作業からその条件付きコンパイルします。If you're using conditional compilation (with C# preprocessor directives) so that your code files work on both Windows 8.1 and Windows Phone 8.1, then you can now review that conditional compilation in light of the convergence work done in Windows 10. 収束は、Windows 10 アプリでいくつかの条件はまとめて削除することを意味します。Convergence means that, in your Windows 10 app, some conditions can be removed altogether. 削除されない条件は、次に説明するように実行時チェックに変更します。Others change to run-time checks, as demonstrated in the examples below.

  で 1 つのコード ファイルでは、Windows 8.1、Windows Phone 8.1、および Windows 10 をサポートするかどうかは、すぎることができます。Note   If you want to support Windows 8.1, Windows Phone 8.1, and Windows 10 in a single code file, then you can do that too. プロジェクトのプロパティ ページで、Windows 10 プロジェクトで参照する場合、プロジェクトが WINDOWS を定義が表示されます_条件付きコンパイル シンボルとして UAP です。If you look in your Windows 10 project at the project properties pages, you'll see that the project defines WINDOWS_UAP as a conditional compilation symbol. WINDOWS と組み合わせて使用するそのため、_アプリと WINDOWS_PHONE_アプリ。So, you can use that in combination with WINDOWS_APP and WINDOWS_PHONE_APP. これらの例では、条件付きコンパイルを 8.1 ユニバーサル アプリから削除して、Windows 10 アプリの同等のコードに置き換えるの単純なケースを示します。These examples show the simpler case of removing the conditional compilation from a Universal 8.1 app and substituting the equivalent code for a Windows 10 app.

最初の例では、PickSingleFileAsync API (Windows 8.1 にのみ適用) と PickSingleFileAndContinue API (Windows Phone 8.1 にのみ適用) の使用パターンを示しています。This first example shows the usage pattern for the PickSingleFileAsync API (which applies only to Windows 8.1) and the PickSingleFileAndContinue API (which applies only to Windows Phone 8.1).

#if WINDOWS_APP
    // Use Windows.Storage.Pickers.FileOpenPicker.PickSingleFileAsync
#else
    // Use Windows.Storage.Pickers.FileOpenPicker.PickSingleFileAndContinue
#endif // WINDOWS_APP

Windows 10 の集約、 PickSingleFileAsync API は、このコードが簡素化します。Windows 10 converges on the PickSingleFileAsync API, so your code simplifies to this:

    // Use Windows.Storage.Pickers.FileOpenPicker.PickSingleFileAsync

次の例では、ハードウェアの "戻る" ボタンを処理しますが、Windows Phone のみが対象となります。In this example, we handle the hardware back button—but only on Windows Phone.

#if WINDOWS_PHONE_APP
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += this.HardwareButtons_BackPressed;
#endif // WINDOWS_PHONE_APP

...

#if WINDOWS_PHONE_APP
    void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
    {
        // Handle the event.
    }
#endif // WINDOWS_PHONE_APP

Windows 10 では、[戻る] ボタンのイベントは、ユニバーサル概念です。In Windows 10, the back button event is a universal concept. ハードウェアまたはソフトウェアに実装されているすべての "戻る" ボタンでは BackRequested イベントが発生するため、このイベントを処理します。Back buttons implemented in hardware or in software will all raise the BackRequested event, so that's the one to handle.

    Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
        this.ViewModelLocator_BackRequested;

...

private void ViewModelLocator_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
    // Handle the event.
}

最後の例は、前の例に類似しています。This final example is similar to the previous one. ここでは、ハードウェアの "カメラ" ボタンを処理しますが、この場合も Windows Phone アプリ パッケージにコンパイルされるコードのみが対象となります。Here, we handle the hardware camera button—but again, only in the code compiled into the Windows Phone app package.

#if WINDOWS_PHONE_APP
    Windows.Phone.UI.Input.HardwareButtons.CameraPressed += this.HardwareButtons_CameraPressed;
#endif // WINDOWS_PHONE_APP

...

#if WINDOWS_PHONE_APP
void HardwareButtons_CameraPressed(object sender, Windows.Phone.UI.Input.CameraEventArgs e)
{
    // Handle the event.
}
#endif // WINDOWS_PHONE_APP

Windows 10 では、ハードウェア カメラ ボタンは、モバイル デバイス ファミリに特定の概念です。In Windows 10, the hardware camera button is a concept particular to the mobile device family. 1 つのアプリ パッケージがすべてのデバイスで実行されるため、アダプティブ コードと呼ばれる手法を使って、コンパイル時の条件を実行時の条件に変更します。Because one app package will be running on all devices, we change our compile-time condition into a run-time condition using what is known as adaptive code. そのためには、ApiInformation クラスを使って、実行時に HardwareButtons クラスの有無を照会します。To do that, we use the ApiInformation class to query at run-time for the presence of the HardwareButtons class. HardwareButtons は、モバイル拡張 SDK で定義されているため、その SDK への参照をプロジェクトに追加して、このコードをコンパイルする必要があります。HardwareButtons is defined in the mobile extension SDK, so we'll need to add a reference to that SDK to our project for this code to compile. ただし、ハンドラーはモバイル拡張 SDK で定義されている型を実装するデバイスでのみ実行されることに注意してください。このようなデバイスは、モバイル デバイス ファミリに該当します。Note, though, that the handler will only be executed on a device that implements the types defined in the mobile extension SDK, and that's the mobile device family. このコードは事実上ユニバーサル 8.1 コードと同等のコードとなるため、このコードでは存在する機能のみを使うように注意してください。これは、別の方法で実施することもできます。So, this code is morally equivalent to the Universal 8.1 code in that it is careful only to use features that are present, although it achieves that in a different way.

    // Note: Cache the value instead of querying it more than once.
    bool isHardwareButtonsAPIPresent = Windows.Foundation.Metadata.ApiInformation.IsTypePresent
        ("Windows.Phone.UI.Input.HardwareButtons");

    if (isHardwareButtonsAPIPresent)
    {
        Windows.Phone.UI.Input.HardwareButtons.CameraPressed +=
            this.HardwareButtons_CameraPressed;
    }

    ...

private void HardwareButtons_CameraPressed(object sender, Windows.Phone.UI.Input.CameraEventArgs e)
{
    // Handle the event.
}

アプリが実行されているプラットフォームの検出」もご覧ください。Also, see Detecting the platform your app is running on.

アプリ パッケージ マニフェストApp package manifest

Windows 10 での変更点トピックでは、追加、削除されると、および変更された要素を含む、Windows 10 用パッケージのマニフェスト スキーマ リファレンスへの変更を示します。The What's changed in Windows 10 topic lists changes to the package manifest schema reference for Windows 10, including elements that have been added, removed, and changed. このスキーマのすべての要素、属性、タイプに関するリファレンス情報については、「要素の階層」をご覧ください。For reference info on all elements, attributes, and types in the schema, see Element Hierarchy. Windows Phone ストア アプリを移植する場合、または Windows Phone ストアのアプリに対する更新となるアプリを作成する場合は、pm:PhoneIdentity 要素が、以前のアプリのアプリ マニフェストの値と一致していることを確認してください (ストアからアプリに割り当てられたものと同じ GUID を使用してください)。If you're porting a Windows Phone Store app, or if your app is an update to an app from the Windows Phone Store, ensure that the pm:PhoneIdentity element matches what's in the app manifest of your previous app (use the same GUIDs that were assigned to the app by the Store). これにより、アプリのユーザーが Windows 10 にアップグレードした場合に、新しいアプリが確実に更新プログラムとして配布され、アプリの重複を避けることができます。This will ensure that users of your app who are upgrading to Windows 10 will receive your new app as an update, not a duplicate. 詳しくは、pm:PhoneIdentity のリファレンス トピックをご覧ください。See the pm:PhoneIdentity reference topic for more details.

プロジェクトの設定 (すべての拡張 SDK の参照を含む) により、アプリが呼び出すことができる API サーフェス領域が決定されます。The settings in your project (including any extension SDKs references) determine the API surface area that your app can call. ただし、ユーザーがアプリをストアからインストールできる実際のデバイスのセットを決定するのは、アプリ パッケージ マニフェストです。But, your app package manifest is what determines the actual set of devices that your customers can install your app onto from the Store. 詳しくは、「TargetDeviceFamily」の例をご覧ください。For more info, see examples in TargetDeviceFamily.

さまざまな宣言、機能、および一部の機能で必要となる他の設定を指定するように、アプリ パッケージ マニフェストを編集できます。You can edit the app package manifest to set various declarations, capabilities, and other settings that some features need. Visual Studio アプリ パッケージ マニフェスト エディターを使って、編集できます。You can use the Visual Studio app package manifest editor to edit it. ソリューション エクスプローラーが表示されていない場合は、 [表示] メニューから選択します。If the Solution Explorer is not shown, choose it from the View menu. [Package.appxmanifest] をダブルクリックします。Double-click Package.appxmanifest. マニフェスト エディター ウィンドウが開きます。This opens the manifest editor window. 変更する適切なタブを選び、保存します。Select the appropriate tab to make changes and then save.

次のトピックは「トラブルシューティング」です。The next topic is Troubleshooting.