xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Visual Studio 2017 (15.1) インストール後に Unity で Windows Store App 向けビルドが通らないときの対処

4/11 から一般提供が開始された Windows 10 Creators Update。このリリースに合わせて Visual Studio 2017 も更新され、内部バージョンが 15.0 から 15.1 になりました。Visual Studio 上ではこんな感じで通知が来ます。

f:id:xin9le:20170423184546p:plain

これをクリックして更新するだけで、インストール状態を判定して全自動でアップデートが完了します。実に素晴らしい!過去に業務で数年インストーラー開発を担当していた自分としては、こういった複雑なアプリケーションのアップデートをユーザーに一切手間を与えないで行うのは本当に尊敬します。だがしかし…!

15.1 に更新するとビルドが通らない

なんということでしょう…。最近は Unity を使って HoloLens のアプリケーション開発をしているのですが、更新しただけでこのビルドが通らなくなってしまったのです。以下のようなエラーが出ます。

f:id:xin9le:20170423185821p:plain

Unity で HoloLens の開発を行うときには HoloToolkit-Unity という (半ば必須とも言える) 公式のライブラリを使用します。使わないで開発する方が普通じゃない、というくらい必ず使います。そして上記のエラーが出ているのはこの HoloToolkit の部分です。自分で作ったものじゃないのでどうしようもない。全自動でアップデートが掛かってこれが起こるとは悪夢としか言いようがない…。

原因

端的に言ってしまうと、原因は Unity が参照している Windows SDK のバージョンが変わってしまったことにあります。Visual Studio 2017 (15.0) の段階では、一緒にインストールされる Windows SDK のバージョンは「10.0.14393」系になります。こんな感じです。

f:id:xin9le:20170423190408p:plain

そして Visual Studio 2017 (15.1) に更新すると「10.0.15063」系がインストールされます。Windows 10 Creators Update 対応版ですね。

f:id:xin9le:20170423194328p:plain

Unity で Windows Store App 向けビルドをする際、この「10.0.15063」系を見に行くようになると先の無慈悲なエラーが出るようになります。そもそもビルドエラーが出るのがオカシイとは思うのですが、対象の Windows SDK (10.0.15063) をアンインストールしてもなぜか改善しません。ワンクリックするだけで全自動で走る素敵な Visual Studio 2017 の更新インストールをするだけで詰みます。もう終わってます。

回避方法

回避方法は 2 つあるでしょう。

1. Visual Studio 2017 (15.0) を使い続ける

簡単です。修正されるまで更新しない。だがしかし、一体いつ修正されるかわからん!そんなことでは日進月歩なこの時代に簡単に置いて行かれてしまう!いつ間違ってワンクリックの超素敵全自動アップデートをしてしまうかわからん!…ので、できれば更新したいというお気持ちだと思います。

2. Unity が参照している Windows SDK のバージョンをちょろまかす

まずまず Unity での Windows Store App 向けビルドが Visual Studio のバージョン自体に直接依存しているわけではありません。必ずどこかの情報を参照して Windows SDK のバージョンを切り替えているはずです。つまり Unity のビルドプロセスでどこを参照しているのかを調べれば OK ということになります。そして気合と勘でいろいろ調べていくと以下のパスにある AssemblyConverter.exe が怪しいと気付きます。

C:\Program Files\Unity\5.x.xxx\Editor\Data\PlaybackEngines\MetroSupport\Tools\AssemblyConverter.exe

この exe は .NET でできているので逆コンパイルして中を覗いていきます。すると、以下のようなコードが出てきます。

f:id:xin9le:20170423192937p:plain

Unity が Windows Store App 向けビルドをする際、以下のレジストリを参照して利用する Windows SDK のバージョンを判定していることが分かります。

項目
キー HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
名前 ProductVersion
データ 10.0.15063

ここの値を「10.0.14393」に書き換えれば OK です。念のためバックアップをしつつ行うと、以下のような感じになります。

f:id:xin9le:20170423193540p:plain

書き換えをしたら Unity を再起動してください。これでビルドが通るようになると思います。

まとめ

ということで、本当に苦労して原因を突き止めました。互換のない状態になっている Windows SDK 自体に問題がある気がしないでもないですが、これでまだしばらくは戦えそうです :)