kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

カテゴリーアーカイブ: Metro

Windows 8 & RT でのサイドローディング


年末年始辺りから調べ初めて、一応これで確定かなと思える段階になりましたので記事おば。

サイドローディングって何ですか?

一般的に Windows 8 / RT ではアプリケーションはマイクロソフトの運営する Windows アプリストアから入手するようになっています。( Windows 8 のデスクトップ環境はこの限りではありません)

Windows アプリストアは全世界に向けて公開されている物なので、企業内利用を前提とするアプリケーション(いわゆるインハウスアプリケーション)の配布と展開には向きません。特に企業秘密なロジックやその他が外部に漏れないように管理したいという場合には向きません。

これにたいする回答がサイドローディングという事になり、Windowsアプリストアを経由せずにアプリケーションをインストールする事ができます。

サイドローディングが可能なクライアントOS

Windows 8 の場合には家庭向けの位置づけがされている無印エディションのみサイドローディングができません。

Windows 8 Enterprise の場合にはドメイン参加時点でサイドローディングが可能になります。

Windows 8 Pro ではOSに追加で Sideloading Activation Key を入手、インストールする事により Sideloading が可能になります。(ただし 一般の Retail 版 Windows Pro ではできません、ボリュームライセンスプログラムによって入手されたWindows 8 Pro が必要という事です。 参考情報1 )

Windows RT は Pro と同様に Sideloading Activation Key を入手、インストールする必要があります。

Sideloading Activation Key の入手

以下のいずれかのライセンスプログラムに加入していれば、ライセンスプログラムの特典として無償入手が可能です。

  • Select / Select Plus による Windows ソフトウェアアシュアランス
  • Windows を含む Enterprise Agreement / Enterprise Subscription Agreement
  • 教育組織では Windows を含む Enrollment of Education Solutions ないしは Campas/School Agreement

上記ライセンスプログラムに加入していない場合には、 Select / Select Plus から購入する事ができます。

製品名 「WinSdLdH 8 … 100Lic EntSideload」 …部にはライセンスプログラム固有なワードが入ります。

WinSdLdH EntSideload の Bing 検索結果

会社として付き合いのあるオープンライセンスのリセラーにこれで問い合わせれば見積もりくれるでしょうし、売ってくれるはずです。

最低でも 100 ライセンスのパックですので、数台の物にインストールするのは結構割に合わないと思います。

Side Loading Activation Key はマシン単位です、1ライセンスは1台にインストールでき、マシンと完全に結び付けされますので、マシンを廃棄その他した場合には消尽する物と考えてください。

ポリシーによるサイドローディングの許可

グループポリシーの「信頼できるすべてのアプリのインストールを許可する」を有効にします。

Sidelading Activation Key のインストール

コマンドロンプトで管理者権限で Slmgr を実行します。

image

/ipk オプションで Sideloading Activation Key の 25桁のプロダクトキーを入力してください。

サイドローディングアプリケーションの展開

手動インストールを行う場合 add-appxpackage PoweShell コマンドレットを使います。

Windows インストールイメージに付属させてアプリケーションを展開するには DISM コマンドの /Add-ProvisionedAppxPackage オプションを使うか、Add-AppxProvisionedPackage PoweShell コマンドレットを使います。

System Centerその他、Windows でアプリケーション展開を行う為の各種システムがサイドローディングに対応しているようです。(そちらは私は調べていません。)

サイドローディングされるアプリケーションの開発

サイドローディングされるアプリケーションは適切な署名がされている必要があります。(以下は自己署名証明書を利用する例です、企業レベルでCAを持っている場合、そのCAで証明書を発行する事が望ましいです)

コードサインニング証明書を作成します /eku オプションの 1.3.6.1.5.5.7.3.3 がコードサインニング証明書を生成する事の指定になっており 1.3.6.1.4.1.311.10.3.13 で証明書が無効になってもコードサインニング署名を有効にするためのオプションです。(これを指定していないと証明書が期限切れで無効になった時にアプリケーションを再署名する必要があります)

C:\Users\kazuk>MakeCert /n “CN=Kazuk” /r /h 0 /eku “1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13” /e “08/01/2013” /sv MyKey.pvk MyKey.cer
Succeeded

数回パスワードをどう設定するか聞いてきますのでパスワードを設定すると Succeeded 表示されファイルが作成されます。

Pvk2Pfx ユーティリティで pfx ファイルを作成します。

C:\Users\kazuk>Pvk2Pfx /pvk MyKey.pvk /pi 検閲削除 /spc MyKey.cer /pfx MyKey.pfx

/pi のパラメータは 証明書のパスワードです。 /po オプションで pfx を利用する際のパスワードを設定できます。

作成された MyKey.cer は展開されるマシンの証明書ストアに配置する必要があり、pfx はアプリケーションの開発に必要になりますので、pvk 含めてちゃんと保存、管理してください。

開発者はプロジェクトに pfx を配置するか証明書ストアに pfxをインポートします。

imageimage

ファイルを選択すると証明書のパスワードを要求されるので、これを入力すると署名が設定されます。

完全な証明書の表示を行うと、MakeCert 時に設定した日付までになっていますので、正しく署名がされる事が確認できます。

cer ファイルを展開先マシンの「信頼される発行元」の証明書ストアに登録する事で、このpfxで署名されたアプリケーションは展開先で信頼されます。(今回は自己署名証明書のため、ルート証明機関にも登録する必要があります)

サイドローディングされるアプリケーションで、Windows Runtime に存在しないAPIを利用する

ポータブルクラスライブラリでインターフェースを宣言し、それを実装する通常のクラスライブラリを作成してMEFでロードすればいけます。これを使うとLOBアプリケーションで SQL Server 等のRDBMSを利用する事も普通にできます。

 

参考情報

1. sideloading product activation key + Windows 8 : MSDN Forum

その他 MSDN や TechNet 見ろ

まとめ

個人事業主としてサイドローディングされるLOBアプリケーションの受注開発、ないしは開発プロジェクトに対しての技術支援等行っておりますので、ご相談ください。

Metro Style Application Code Samples–XAML Data Binding Samples


Windows 8 Code Samples and Examples in C#, VB.NET, C++, JavaScript

とりあえずインストールした Visual Studio 2012 RC で Metro Style App のプロジェクトを作ると

// The Split App template is documented at http://go.microsoft.com/fwlink/?LinkId=234228

って感じでリンクされている LinkId 234228 でたどり着くサンプルギャラリー。

質はわからないけど量は十分と言っていい気がするし、一覧を眺めてみた限りでは内容も多岐にわたっている気がする。このあたりは Microsoft本気だなと思わないでもない。

日本語での情報提供は翻訳の都合で遅れるのが常なので世界についていく気なら英語だろうがコードだろうが気合で読むのみで色々見るのをおすすめ。龍に乗るなら首根っこ、尻尾掴んでも振り落とされるのが落ちだ。

というわけで、もっとも基本っぽい XAML Data Binding sample をチェックしてみるなど。コンパイル&実行は全く問題なく完了、普通に実行しながらソースを確認することをお勧めです。

チェックの目的は WPF や Silverlight との相違点等を確認しておきたいということなので、 WPF / Silverlight のソースをあまり見たことが無い人はもっとチュートリアル的な物から見たほうが良いかも。

 

Scenario1 ~ Scenario7 までの xaml と xaml.cs が本体と言っていい感じ。

Scenario1.xaml XAMLのデータバインディングの { Binding … Mode=[バインディングモード] } のバインディングモードの TwoWay, OneWay, OneTime の違いを見せようというもの。 WPF / Silverlight との違いは特に見えず。

簡単にさっくり解説すると以下の通り。

TwoWay の場合、テキストボックスに入力した内容はスライダーに反映され、スライダーの内容はテキストボックスに反映される。このような双方向のバインディングを行う場合には TwoWay を使う。もっともよく使うモードだと思う。

OneWay の場合、スライダーの操作はテキストボックスに反映されるけど、テキストボックスの修正はスライダーに反映されない。このような一方向のバインディングを行う場合には OneWay を使う。テキストボックスのような入力を受けるコントロールと結びつけると変に感じるが表示専用の物につなぎ合わせるにはこっちの方がお得というもの。

OneTime の場合、コントロールの初期化時に一発反映したら後はやらないよという物。変更前の値を表示しておきたいという用途には便利だけどそれ以外での局面では全く役に立たない系。

 

Scenario2 は IValueConverter によってスライダー値を F から SUPER STAR! の段階を示す文字列に変換してテキストボックスに変換するもの。 E への変換が無いねとか余計。

この変換は S2Formatter.cs にて宣言されている Windows.UI.Xaml.Data.IValueConverter の実装によって変換されている。

<StackPanel.Resources>
    <local:S2Formatter x:Key=”GradeConverter”/>
</StackPanel.Resources>

で S2Formatter を GradeConverter で宣言、

Text=”{Binding ElementName=sliderValueConverter, Path=Value, Mode=OneWay,
              Converter={StaticResource GradeConverter}}”

で GradeConverter を利用している。 Mode が OneWay なので S2Formatter での変換も一方向しか実装されていない。

S2Formatter.cs の実装内容はあまりマネしてほしくないところ、メソッド内のローカル変数に _ でプリフィックスをつけるとか基本として見たことのないネーミングスタイルなので注意。

 

Scenario3 は Emploee というクラスにデータバインディングするというもの。 Emploee は Scenario3.xaml.cs からMainPageのDataContextとして渡されています。

単純には DataContext に渡したオブジェクトとデータバインディングされますよという内容とみればいいでしょう。

 

Scenario4 は Team.cs で定義された Teams リストの3番目の要素にデータバインディングを行うという物。

Binding のPathシンタックスでの ‘[‘ + インデックス + ‘]’がインデックスが整数(配列ないしはリスト)、その他(コレクション)でバインディングができるという事を示しています。

 

Scenario5 は同じく Team.cs で定義された Teams リストにバインディングしますが、 Border の Background を Team のColor にバインディングすることで背景色を変えるというもの。 Text や Value 以外でもバインディングできるので、見た目をバインディングで変えられるということを示しているだけですね。

 

Scenario6 は同じく Teams にバインディングしますが、ListItem のGroupStyleを介してHeaderTemplate を与えることで、Key 要素ごとにヘッダーを表示するというもの。

var result = from t in teams
             group t by t.City into g
             orderby g.Key
             select new { Key = g.Key, Items = g };

のLINQクエリによってグループ化された物のKeyをグループヘッダーとして表示しています。LINQクエリとグループヘッダテンプレートの合わせ技でそこそこ簡単にできますよってところです。

 

Scenario7は同じくTeams にバインディングしますが、選択要素の削除を実装しています。ハンドラの実装は以下のもの。

void BtnRemoveTeam_Click(object sender, RoutedEventArgs e)
{
    if (ocTeams.Count > 0)
    {
        int index=0;
        if (lbTeams.SelectedItem != null)
            index = lbTeams.SelectedIndex;
        ocTeams.RemoveAt(index);
    }
}

データバインディングですべてが行われていますので単純にコレクションから要素を削除すれば要素が消えますってもの。

選択されてなかったら最初の要素を消すという乱暴な実装に見えますが良いんでしょうか?コピペしないでね?なサンプルは勘弁してほしいですね。

気になるところとしては

<Button x:Name=”btnRemoveTeam” Content=”Remove team”/>

と Click ハンドラの結び付け、コンストラクタで以下を書いてますが、Commandパターンとかは入ってない感じですかね?コードビハインドにコードを書きたくないタイプの人なのでこういうのがずらずらしちゃうのはちょっといやんな感じです。

btnRemoveTeam.Click += BtnRemoveTeam_Click;

 

まとめ

そんなに大きく WPF / Silverlight と異なる印象はありません。名前空間の配置など実装は当然に変わっていますが大きくは変わっていないということが解っただけでした。

テクノロジの特性なのかもしれませんが、周辺がいろいろと冗長です。XAMLなどは説明したい部分が埋没していると思われるぐらいです。何を説明しようとしているのか、それを読み取って見ないと迷子になりますのでポイントをかいつまんで読みましょう。かいつまんで読むことができる人(ポイントのわかってる人)はこのレベルのサンプルは見ないというか必要ないかもな気もしないでもないですけど。

Scenario2 で現れる IValueConverter はお察しの通り大量に書くことになるでしょう。データ値と見た目のフォーマットの変換処理はほとんどの場合 IValueConverter で実装することになります。これの実装の為の項目テンプレートが標準のプロジェクトテンプレートにはありませんので、項目テンプレートを切り出ししておく事をお勧めです。ただしこのサンプルに含まれる IValueConverter の実装は変数名のネーミングがいまいちで普通のコーディング規約にはマッチしないはずなのでもう少し良い物をベースに選ぶか納得いく形に書き換えてから、コーディングのヒントをコメントにふんだんに盛り込んだ項目テンプレートを作るのが良いでしょう。

Visual Studio 2012 にはネーミングルールによる変数名の警告や補正の仕組みは入らなかった模様、必要な人は ReSharper を入れるとルールに沿ってない場合には警告してもらえるし QuickFix で大抵はいい名前に直してもらえますのでこの機会に投資する気ならした方がいいかもしれません。(ちょっとReSharper以外に浮気しようかと思ってVSギャラリー見回してみたのですがグッとくる物は見当たらなかったです)

良いサンプルだとは思いますが、コレクションからの削除の実装が選択されていなければ先頭を消すとか鵜呑みにしてはいけない内容を多分に含んでいますのでご注意を。