フォアグラウンド アプリケーションの開発

Windows 10 IoT Core でサポートされている言語のほか、IoT Core でサポートされている UWP アプリと非 UWP アプリの種類について説明します。

Note

Visual Studio では、Visual Studio がアクセスできる RS4 以上の SDK がインストールされていない限り、RS5 (または OpenSSH が有効になった RS4) IoT イメージにデプロイするときに暗号エラーが生成されます。

アプリケーションの種類

ユニバーサル Windows プラットフォーム (UWP) アプリ

IoT Core は UWP の要となる OS であり、その主要なアプリの種類は UWP アプリです。

ユニバーサル Windows プラットフォーム (UWP) は、Windows 10 IoT Core を含め、あらゆるバージョンの Windows 10 に共通のアプリ プラットフォームです。 Windows ランタイム (WinRT) が進化して UWP となりました。 UWP の詳細および概要については、こちらでご覧いただけます。

Visual Studio は、IoT Core 向けの UWP アプリ作成のほか、開発全般に使用される主要なツールです。 Visual Studio の互換性要件について詳しくは、こちらを参照してください。

従来の UWP アプリ

UWP アプリは、他のWindows 10 エディションで実行したときと同じように、IoT Core 上でも普通に動作します。 Visual Studio で作成した単純な空の XAML アプリは、スマートフォンや Windows 10 PC にデプロイする感覚で、問題なく IoT Core デバイスにデプロイできます。 UWP に使用される標準の言語とプロジェクト テンプレートがすべて IoT Core 上で完全にサポートされます。

IoT のシナリオをサポートするために、従来の UWP アプリモデルに、いくつか追加された要素があり、それらを利用する UWP アプリでは、対応する情報がそのマニフェストに追加されている必要があります。 特に "iot" 名前空間は、そうした標準 UWP アプリのマニフェストに追加されていなければなりません。

マニフェストの <Package> 属性内で、iot xmlns を定義し、それを IgnorableNamespaces リストに追加する必要があります。 完成した XML は次のようになります。

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
  IgnorableNamespaces="uap mp iot">

バックグラウンド アプリ

IoT Core には、従来の UI アプリに加え、UWP アプリの種類として "バックグラウンド アプリケーション" が新たに追加されました。 これらのアプリケーションには、UI コンポーネントがない代わりに、"IBackgroundTask" インターフェイスを実装するクラスが存在します。 そのクラスは "StartupTask" として登録され、システム ブート時に実行されます。 これらはあくまで UWP アプリであるため、同じ API 群にアクセスでき、また同じ言語でサポートされます。 違いは、UI エントリ ポイントがないという点だけです。

IBackgroundTask の型には、それぞれ固有のリソース ポリシーが割り当てられます。 バックグラウンド アプリがフォアグラウンド UI アプリの二次的なコンポーネントとなっているようなデバイスでは、バッテリー残量とマシンのリソースを節約するために制限は厳しくなるのが一般的です。 IoT デバイスでは、バックグラウンド アプリがデバイスの主要な機能を果たすことも少なくありません。そうした StartupTask には、他のデバイスであればフォアグラウンドの UI アプリに適用されるようなリソース ポリシーが割り当てられます。

次のサンプルは、LED を点滅させる C# のバックグラウンド アプリを作成するために必要なコードを示したものです。

namespace BlinkyHeadlessCS
{
    public sealed class StartupTask : IBackgroundTask
    {
        BackgroundTaskDeferral deferral;
        private GpioPinValue value = GpioPinValue.High;
        private const int LED_PIN = 5;
        private GpioPin pin;
        private ThreadPoolTimer timer;

        public void Run(IBackgroundTaskInstance taskInstance)        {
            deferral = taskInstance.GetDeferral();
            InitGPIO();
            timer = ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick, TimeSpan.FromMilliseconds(500));

        }
        private void InitGPIO()
        {
            pin = GpioController.GetDefault().OpenPin(LED_PIN);
            pin.Write(GpioPinValue.High);
            pin.SetDriveMode(GpioPinDriveMode.Output);
        }

        private void Timer_Tick(ThreadPoolTimer timer)
        {
            value = (value == GpioPinValue.High) ? GpioPinValue.Low : GpioPinValue.High;
            pin.Write(value);
        }
    }
}

バックグラウンド アプリの詳細な情報は、こちらでご覧いただけます。

UWP 以外のアプリ

IoT Core では、Win32 コンソール アプリや NT サービスなど、従来の Win32 タイプのアプリもある程度サポートされます。 それらのアプリは、Windows 10 デスクトップの場合と同じようにビルド、実行されます。 また、そうしたアプリを Visual Studio で簡単に作成できるよう、IoT Core C++ コンソール プロジェクト テンプレートが用意されています。

こうした UWP 以外のアプリケーションには、主に次の 2 つの制限があります。

  1. "レガシ Win32 UI はサポートされない": クラシック (HWND) ウィンドウを作成するための API は、IoT Core には含まれていません。 CreateWindow() や CreateWindowEx() などのレガシ メソッドを含め、Windows ハンドル (HWND) を扱うメソッドは一切利用できません。 さらに、そのような API に依存するフレームワーク、たとえば MFC、Windows フォーム、WPF は、IoT Core ではサポートされません。
  2. "C++ アプリのみ": IoT Core 上の Win32 アプリの開発でサポートされるのは、現在 C++ のみです。

プログラミング言語

IoT Core でサポートされるプログラミング言語は多岐にわたります。

標準の言語

Visual Studio には、従来の UWP 言語が標準で備わっており、既定でサポートされます。 これらの標準言語はいずれも、UI アプリケーションとバックグラウンド アプリケーションの両方をサポートしています。

  • 言語
    • C#
    • C++
    • JavaScript
    • Visual Basic

Arduino Wiring

Arduino Wiring を使用するには、Visual Studio の [ツール] ->[拡張機能と更新プログラム] マネージャーから "Windows IoT Core プロジェクト テンプレート" をダウンロードする必要があります。 Arduino Wiring でサポートされるのは、バックグラウンド アプリケーションのみです。 C#、C++、Visual Basic のいずれかを使用して "Windows ランタイム コンポーネント"を作成し、そのライブラリを他の言語から参照することもできます。

C# と Visual Basic (VB)

C# と VB はどちらも UWP アプリとしてサポートされており、.NET Framework の中の、UWP アプリケーション向けに用意されている機能にアクセスできます。 XAML で構築された UI アプリのほか、バックグラウンド アプリもサポートされます。 また、サポートされている他の言語から使用できる "Windows ランタイム コンポーネント" を作成することもできます。

サンプル:

JavaScript

UI アプリとバックグラウンド アプリは、どちらも JavaScript を使用して作成できます。 UI アプリは、すべての UWP エディション上で同じように動作します。 バックグラウンド アプリは、IoT Core に新たに追加されたものですが難しくはありません。 次のサンプル コードでは、"JS の新しいプロジェクト テンプレート" の出力を示しています。

// The Background Application template is documented at http://go.microsoft.com/fwlink/?LinkID=533884&clcid=0x409
(function () {
    "use strict";

    // TODO: Insert code here for the startup task

})();

C++

C++ を使用すると、UWP のバックグラウンド プロジェクトと "非 UI" の Win32 アプリのほか、XAML アプリや DirectX UI アプリも作成できます。

サンプル:

Note

C++ でのアプリ作成を予定している方は、ダウンロード時に、UWP C++ チェック ボックスをオンにする必要があります。

Visual Studio 用 C++

?### Arduino の配線

Arduino Wiring がサポートされたことで、IoT エコシステムに広く普及しているさまざまなコンポーネントや周辺機器向けのアプリを Arduino Wiring で作成できるようになりました。

Arduino Wiring プロジェクト ガイド」には、そうしたアプリを作成するための詳しいセットアップ手順が紹介されています。 初めて自分でアプリを作成する際は、以下に記載したサンプルやリンクをお役立てください。 WinRT コンポーネントを Arduino で作成して、他の言語から使用することもできます。

"Blinky サンプル コード" 詳細なサンプル コードとドキュメントについては samples ページから入手できます。また、以下に記載した完全なコードもご覧ください。

void setup()
{
    // put your setup code here, to run once:

    pinMode(GPIO5, OUTPUT);
}

void loop()
{
    // put your main code here, to run repeatedly:

    digitalWrite(GPIO5, LOW);
    delay(500);
    digitalWrite(GPIO5, HIGH);
    delay(500);
}