本連載ではWindowsランタイム・コンポーネントを作成する際の方針、手順、ポイントを取り上げていくが、その前に、それ以外のコード再利用方法について簡単に紹介しておこう。
まず、一般論として、Windowsストア・アプリをC#やVBで実装する場合、再利用したいコードがC#、VBで作成されていれば、Windowsストア用のクラス・ライブラリとして再ビルドすることで参照して利用することが可能だ。これは、C++のWindowsストア・アプリからC++の既存のライブラリを再利用する場合も同様である。いずれの場合も、Windowsストア用に再ビルドすることで利用できる。
なお、実際に再ビルドを行う場合は、既存のプロジェクトの設定を直接変更するのではなく、Visual Studio 2012で新しいプロジェクトを作成し、[既存項目の追加]ダイアログから既存のソース・ファイルを追加する方がよいだろう。Visual Studio 2012には、C#/VBであればWindowsストア用に[クラス ライブラリ (Windows ストア アプリ)]、C++/CXであれば[DLL (Windows ストア アプリ)]または[スタティック ライブラリ (Windows ストア アプリ)]というプロジェクト・テンプレートが用意されているからだ。これらのプロジェクト・テンプレートを利用すれば、プロジェクト作成時にあらかじめ必要な設定が行われるので、ビルドに関するミスをなくせる。
ここで問題となるのが、C++/CLIで開発したクラス・ライブラリである。そもそも.NET Frameworkを利用している場合は全面書き換えが必要となる。ただし、C++/CLIの想定された利用方法である、C#やVBにネイティブ・コードの機能を提供している場合については、外部インターフェイスがCLI型からPlatform型となるように名前空間を交換するだけで、Windowsランタイム・コンポーネント化できる可能性がある。
以下はC++/CLIで書かれたコードの例だ。この例では文字列定数を単に返しているだけだが、実際にはWin32APIやCOMコンポーネントを呼び出して結果の文字列を返しているものと想定して欲しい。
using namespace System;
namespace CppLib
{
public ref class Class1 // ref class宣言したクラスはCLI型となる
{
public:
static String^ GetGreeting() // ←StringはCLI型(System::String)
{
return "hello";
}
};
}
すでに説明したように、C++/CLIのプログラムをWindowsランタイムは実行できない。Windowsストアアプリから利用できるようにするためには、C++/CLIからC++/CXへの移植、つまりWindowsランタイムコンポーネント化が必要だ。この例でC++/CLI固有の記述は、System::StringというCLI型の利用と、public ref class Class1というCLI型クラスの宣言である。この2点を修正してC++/CXのコードとすると以下のようになる。
using namespace Platform; // ← 名前空間をSystemからPlatformへ置き換える
namespace CppLib
{
public ref class Class1 sealed // ←C++/CXでpublic ref class宣言したsealedクラスはWindowsランタイム型となる
{
public:
static String^ GetGreeting() // ←StringはWindowsランタイム型(Platform::String)
{
return "hello";
}
};
}
いずれの場合であっても、JavaScriptコードからこれらのコードを再利用したければ、Windowsランタイム・コンポーネント化が必要である。
以下の表は、Windowsストア・アプリ用のコード再利用方法についてまとめたものだ。表の列には利用するWindowsストア・アプリの開発言語を、行には再利用形態を示す。
JavaScript | C#/VB | C++/CX | |
---|---|---|---|
C#/VBクラス・ライブラリ | △ | ○ | △ |
C++/CLIクラス・ライブラリ | △ | △ | △ |
C/C++ネイティブDLL | △ | △ | ○ |
C/C++ネイティブ・スタティック・ライブラリ | △ | △ | ○ |
なお、上の表で○の項目であってもWindowsストア・アプリでサポートされていないAPIについては修正が必須である。
Windowsストア・アプリではサポートされないCランタイム関数については、MSDNサイトの「/ZW でサポートされない CRT 関数」で示されている。
また、Win32 APIについては、MSDNサイトの「Win32 and COM for Windows Store apps」に記されているようにヘッダ・ファイルのうちDesktop Familyリージョンとされているものがサポート対象外である。Visual Studio 2012でWindowsストア・アプリ用プロジェクト・テンプレートを利用すると、これらのAPIはIntelliSenseの表示対象とならないので判断可能だ。
Windowsストア・アプリ用.NETについては、MSDNサイトの「Windows ストア アプリ用 .NET - サポートされる API」というリファレンスを参照。なお、「System名前空間のTypeクラス」のようにクラス自体は存在するが、クラス内のメソッドやプロパティがサブセット(=機能縮小版)となっているものが多数ある。Windowsストア・アプリでサポートされているメソッドとプロパティについては、先ほどのリファレンスの個々の項目に対して緑のカバンのアイコンで示されている(例えば「TypeクラスのAssemblyQualifiedNameプロパティ」の項目の左に、このアイコンが表示されている)。
今回はWindowsランタイム・コンポーネントの概要と、Windowsストア・アプリの実行環境、Windowsストア・アプリで既存のコードを再利用する際の基本方針に述べた。次回はC#で簡単なWindowsランタイム・コンポーネントを作成し、その後、C++/CXでの既存コードのWindowsランタイム・コンポーネント化について考察していくことにする。
Copyright© Digital Advantage Corp. All Rights Reserved.