PR ソフトウェア

Windowsアプリ開発 VisualC# MVVMの備忘録(Visual Studio 2017 Livet導入編)

久々にWindowsアプリ開発の仕事が入ったことをきっかけに、個人的な興味も兼ねてVisual Studio 2017でMVVMインフラ「Livet」を使う方法について調べてみました。

というのも2018年9月現在でLivetの最新バージョンはv1.3で、かつVS2015までの対応版となっていて、VS2017対応版はLivet 2を待たなければならない状況が長らく続いていたからです。

実際、「Livet を Visual Studio 2017 に導入」などでインターネット検索してみると、出てくる記事はLivet v1.3をテクニカルな技術でVS2017上で動作できるようにさせるなどの方法に関する記事が多かく初学者にはハードルが高めという印象を受けました。

しかし、その後、2018年10月25日にLivet v2.0.0がリリースされていたことを知り、さらに2018年11月23日にLivet v2.1.0のリリースを知ることになります。

Livet v1.3 on Visual Studio 2017の導入失敗

最初にLivet v1.3によるVisual Studio 2017への導入をトライしましたが、途中でLivetインストーラの作成に失敗し、頓挫してしまったのですが、今後のために簡単に備忘録という形で実施した作業を残したいと思います。(後で新たな展開があったときは更新したいと思います。。。)

【Livet v1.3 on Visual Studio 2017インストーラ作成にトライ、そして失敗経過備忘録】

GitHubからLivet v1.3をダウンロード

GitHubからLivet v1.3をダウンロードします。

ダウンロードしたソースをvs2017向けに編集

Livet-master\archives\Installer\Files\Snippets内のLivetProperty_CSharp.snippetをvs2017向けに編集

RaisePropertyChanged(nameof());
↓
RaisePropertyChanged(nameof($name$));

Livet-masterを日本語パスが入らないパスへ移動

※Wix3.5以上のリンカ(light.exe)のバグによりインストーラ作成ができなくなるとの情報があったため

インストーラ作成バッチファイル(MakeInstaller.ps1)実行用Wix3.6以上をインストール

WiX v3.11.1(wix311exe.zip)ダウンロード後、C:\Program Files\WiX Toolset v3.11にインストール完了。

Livet-master\archives\Installer\MakeInstaller.ps1のWixのパスを編集

$WixBinFolder = "C:\Program Files (x86)\WiX Toolset v3.10\bin"

$WixBinFolder = "C:\Program Files\WiX Toolset v3.11\bin"

編集したインストーラ作成バッチファイル(MakeInstaller.ps1)をPower Shellで実行

・スタートメニューからpower shellと入力し、Windows PowerShellを”★管理者権限”で起動
※(参考)Powershellを楽に実行してもらうには – Qiita

・同画面で現在の設定を確認

>Get-ExecutionPolicy

でRestricted(実行不可)

・実行ポリシーの変更

>Set-ExecutionPolicy RemoteSigned

・インストーラ作成バッチファイル(MakeInstaller.ps1)の実行

> .\MakeInstaller.ps1

・バッチファイル中のCopy-Item
"../Livet.ItemTemplateExtension\bin\Release\Livet.ItemTemplateExtension.dll" "./Files" -Fでエラー、Livetプロジェクトをコンパイルしてdllを作成する必要があると判断。

Livetプロジェクトをvs2017でビルド

・\Livet-master\Livet.slnを開く。

・途中、.NET Framework 4.7.2がターゲットであることを聞かれるので、.NET Framework 4.7.2のインストールを選択する。

・手動で.NET Framework 4.7.2(NDP472-DevPack-ENU.exe)をインストール後、プロジェクトの読み込みに成功する。

・ここで『名前空間の名前 'Interactivity' が名前空間 'System.Windows' に存在しません』というエラーが出る。System.Windows.Interactivity.dllはBehaviorで使用するExpression BlendのSDKに含まれ、インストールする必要があるらしいとのこと。

・Microsoft Expression Blend 4 Software Development Kit (SDK) for .NET 4のインストーラ(BlendWPFSDK_ja.msi)をダウンロード

・BlendWPFSDK_ja.msiを実行

・C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries下に次のファイルがコピーされたことを確認
『System.Windows.Interactivity.dll』
『Microsoft.Expression.Interactions.dll』
※Microsoft Expression Blend 4 Software Development Kit (SDK) for .NET 4と同様なものにMicrosoft Expression Blend 4 Software Development Kit (SDK) for SilverlightがあったがMicrosoft Silverlightはウェブブラウザ用のプラグインなのでとりあえずインストールしなくてもよいと判断。

・上記2つのdllをVisual Studioの参照設定から追加
※ソリューション エクスプローラーで、Livetプロジェクトの[参照] ノードを右クリックし、[参照の追加] を選択。追加する参照を指定してから、[OK] をクリックします。

インストーラ作成バッチファイル(MakeInstaller.ps1)の再実行

・Windows PowerShellを”★管理者権限”で再起動して再度実行

> .\MakeInstaller.ps1

バッチファイルは最後まで通ったもののLivetSetup.cab(※)が更新されない。

※\Livet-master\archives\LivetSetup.Bootstrapper\LivetSetup.cabの更新されないため、その後LivetSetup.Bootstrapperプロジェクトをビルドすることでインストーラーを作成という流れだったのですが、ここで頓挫しました。(このタイミングでLivet "v2.1.0"の記事を目にし、すぐに作業方針をきりかえました ( ̄∇ ̄))

忘れないうちにWindows PowerShellの実行ポリシーを元に戻しておく。

>Set-ExecutionPolicy Restricted
>Get-ExecutionPolicy

Livet "v2.1.0" on Visual Studio 2017の導入成功

Livetメンテナーの書かれたLivet v2.1.0のリリースのお知らせブログを参考にLivet 2.1.0とLivet用VS2017拡張機能、さらにビヘイビア関連ライブラリ(Blend for Visual Studio SDK for .NET)をインストールし、LivetアプリケーションをVS2017上で作成、実行までの流れを残していきます。

Nugetパッケージのインストール(VS2017に同梱済の場合は不要)

Livet v2.1.0はインストーラではなくNugetパッケージの形でリリースされているため、インストールにはNugetプログラムのインストールが必要です。ちなみにこのNugetプログラムは「コマンドライン版」と「VS2017版」があるのですが、VS2017版のほうが後々の作業が楽になります(スマホ開発者にとってはEclipseやAndroid Studioなどのパッケージ更新ツールに似ているといえばイメージしやすいでしょう)。
※一応、参考までにNugetコマンドライン版について触れておきます。インストールはこちらから可能です。2018年11月時点の安定版はnuget.exe v4.8.1とのことです。

実行方法はコマンドプロンプトから

>nuget.exe install LivetCask -Version 2.1.0

 となります。

LivetCask 2.1.0のインストール

・VS2017のNugetパッケージ管理設定よりパッケージマネージャーを開き、次のコマンドを実行

 PM> Install-Package LivetCask -Version 2.1.0

※(参考)LivetCask 2.1.0のパッケージファイルをローカルにダウンロードしてからオフラインインストールしたい場合

NuGet Gallery | LivetCask 2.1.0をダウンロード(livetcask.2.1.0.nupkgをダウンロード)できますが、個人的には前述のオンラインインストールを推奨します(パッケージのバージョン不一致に心配が少し解消されます)。

・Livet用VS2017拡張機能のインストール

Livet プロジェクトテンプレート・アイテムテンプレート・コードスニペット拡張機能 - Visual Studio Marketplaceからインストーラ(Livet.Extensibility.vsix)をダウンロードおよび実行

ビヘイビア関連ライブラリ(System.Windows.Interactivity.dll、Microsoft.Expression.Interactions.dll)の参照削除

VS2017の参照設定にSystem.Windows.Interactivity.dll、Microsoft.Expression.Interactions.dllが含まれている場合は設定から削除しておきます。後にインストールする「Blend for Visual Studio SDK for .NET」内に同dllが提供する機能(名前空間)が含まれているからです。

「Blend for Visual Studio SDK for .NET」のインストール

・VS2017のNugetパッケージ検索機能で「Blend for Visual Studio SDK for .NET」と検索すると『Microsoft.SDK.Expression.Blend(Microsoft Expression Blend SDK for 4.5)』がヒットするので選択してインストール
「Blend for Visual Studio SDK for .NET」をインストールすることで、Livet v1.3 for VS2017インストーラ作成時のビルドエラーの原因となっていたビヘイビア関連ライブラリSystem.Windows.Interactivity.dll、Microsoft.Expression.Interactions.dllを改めて、インストールする必要がなくなり、参照エラーやバージョン不一致エラーも出なくなりました。

【(参考)ビヘイビア関連ライブラリのバージョン一致エラーメッセージ】

System.Windows.Markup.XamlParseException
  HResult=0x80131501
  Message=ファイルまたはアセンブリ 'System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=xxxxxxxx'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
  Source=PresentationFramework
  スタック トレース:
   場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   場所 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   場所 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   場所 System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   場所 MyLivetApp.Views.MainWindow.InitializeComponent() (E:\programmingstudy\vcs2017\LivetApp\MyLivetApp\MyLivetApp\MyLivetApp\Views\MainWindow.xaml):行 1

内部例外 1:
FileLoadException: ファイルまたはアセンブリ 'System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=xxxxxxx'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:xxxxxxxx)

Livet MVVMアプリケーションのビルド、動作確認

・ビルド時、心配していたxamlのi:Interaction.Triggers未定義エラーがでず、ビルドが成功することを確認(リリースビルド成功を確認)

ここで、気になることがありました。リリースビルド時に生成されたdllのバージョンを確認してみました。

---
Livet.dll ※製品バージョン 1.3.0.0(更新日時2018/11/23 0:58)
System.Windows.Interactivity.dll ※製品バージョン 3.0.40218.0(更新日時 2017/09/03 10:39)
Microsoft.Expression.Interactivity.dll ※製品バージョン 同上(更新日時 同上)
---

むむ?!Livetのバージョンがv1.3?!間違って古いバージョンを入れてしまったかと思いきや、更新日時は2018/11/23とLivet v2.1.0リリース日と一致している。設計バージョン 1.3は変わらず、VS2017対応版ということで製品バージョンのみ数字をあげたという意味?、あと、新規プロジェクト作成時のテンプレート選択画面でVS2015までに見られた『Livet MVVM インフラストラクチャ アプリ』が表示されず、かわりに『Livetプロジェクトテンプレート(C#)』が表示され、これを選択することでLivetアプリケーションを作成、ビルド・実行できることを確認できたが、はたしてこれでよいのだろうか。。。
Livetのインストール方法が変わったことと何か関係があるのだろうか(v1.3まではexe形式のインストーラ、v"2.1.0"はNugetパッケージによるインストール)

まあ、何はともあれ、Livet "v2.1.0" on Visual Studio 2017の導入プロジェクトはLivetアプリケーションをVS2017上でのビルド・実行を確認でき、個人レベルでは一応、当初の目標は達成したので、Livet "v2.1.0"のメンテナーの方々には感謝です♪(о ̄∇ ̄)/

-ソフトウェア