UnityでHoloLens用のUWPなPulginsを作る際にはライブラリバージョンに注意する

# UnityからUWPアプリケーションをビルドすると意外と古いバージョンなんです。
Unityはエディター上で作成した３Dアプリケーションをマルチプラットフォームようにビルドすることができます。そのうち、HoloLensやImmersiveなWindows Mixed Reality HMD向けにUWPアプリケーションをビルドで生成します。この際、UnityはVisual Studio用にUWPのプロジェクトを作成しますが、Visual Studioを通して作っているわけではないので本来起こりえない設定でも構成できてしまう場合があります。問題はVisual Studioもそのまま正常に配置までできてしまうこと。動作させて初めておかしなエラーが発生します。

## UWPなプラグインをVisual Studioで作る場合は必ず参照するライブラリバージョンを変える
結論から書きますが、unity用のpluginとしてUWPのライブラリを作成する場合は参照する<font color="red">Microsoft.NETCore.UniversalWindowsPlatformのバージョンを「5.0.0」「5.1.0」</font>に変更して作成する必要があります（厳密には5.0.0にしたほうがいいかもしれない）。

## 何が問題になるのか
UnityにはPluginという仕掛けがあります。これは予め作成したdll等のライブラリをAssetに登録し「Unity Editor」や「ビルド後のプロジェクト」で参照して利用できる機能です。「Project」パネルの任意の箇所に「Plugins」をいうフォルダを作成します。このフォルダにdllを配置することで、Unityのビルド時にPlungins内のdllを自動的に参照できるような形でプラットフォーム毎のビルド資産を構成してくれます。

さて、何が問題になるかなのですが、Pluginsとして開発するUWP用のdllはUWPの基本ライブラリを参照しています。実はUWPの基本ライブラリのバージョンが<font color="red">「Unityが自動生成するUWP用プロジェクト」と「Pluginsとして作成したUWP用のdll」で合っていなくてもUnity上ではエラーにならない</font>ことです（ビルドも含めて）。
Visual StudioではUWPの基本ライブラリのバージョンが異なるプロジェクト同士は参照ができない仕様になっています（一応バージョンダウングレードできる場合は内部的にこっそりしてくれる場合もある）。

さらに困ったことにバージョンが異なる場合でも<font color="Red">Visual Studioもビルドが正常終了</font>します。このため結果として、動かしてみて初めて参照関係の不一致によりエラーが発生する事態に陥ります。

## ツール標準の参照バージョン

「UnityでUWPソリューションを作成（ビルド）」、「Visual StudioでUWPソリューションを作成」それぞれが参照するライブラリを整理すると以下のようになります。

### UnityからUWPアプリケーションをビルドした場合のライブラリのバージョン
UnityからUWPアプリケーションを出力すると現在どのバージョンのUnityでもUWP関連のライブラリは以下のバージョンで出力されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/f0e0c04a-14ce-0e5a-fc3f-f31857fc9429.png)

| ライブラリ名 | バージョン |
|:-:|:-:|
| Microsoft.ApplicationInsights  |V1.0.0   |
| Microsoft.ApplicationInsights.PersistenceChannel  | V1.0.0 |
| Microsoft.ApplicationInsights.WndowsApps  | V1.0.0 |
| Microsoft.NETCore.UniversalWindowsPlatform  | V5.0.0 |

### Visual StudioでUWP用のクラスライブラリプロジェクトを作成した場合のライブラリのバージョン
Visual Studioで空のUWPクラスライブラリを生成すると以下のバージョンで出力されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/1525abda-8a0a-6402-0d69-a597e96157e3.png)

| ライブラリ名 | バージョン |
|:-:|:-:|
| Microsoft.NETCore.UniversalWindowsPlatform  | <font color="red">V5.2.3</font> |

上記の通り、作成時の基本ライブラリのバージョンが合っていませんので作る際には合わせてください。

## ついでに調べてみました。

### Unityが出力したUWPアプリケーションでのMicrosoft.NETCore.UniversalWindowsPlatformのバージョン

| Unityバージョン | Microsoft.NETCore.UniversalWindowsPlatformのバージョン |
|:-:|:-:|
| 5.5.4f1  | 5.0.0  |
| 5.6.1f1  | 5.0.0  |
| 5.6.2f1  | 5.0.0  |
| 2017.1.0f3  | 5.0.0  |
| 2017.2.0b9  | 5.0.0  |

今のところ、Unityからは5.0.0でしか出力されないようです。

### Microsoft.NETCore.UniversalWindowsPlatformのバージョンとVisual StudioとHoloLensの関係

Microsoft.NETCore.UniversalWindowsPlatformのバージョン毎に対応するVisual Studio、HoloLensにデプロイできるのかを整理してみました。5.3.0からはVisual Studio 2017が必須となります。HoloLensで現状動くのは5.2.3までです。5.3.0からがいわゆるCreators Update関連の何か？

| Microsoft.NETCore.UniversalWindowsPlatformのバージョン | Visual Studio 2015 | Visual Studio 2017 | HoloLensが動く |
|:-:|:-:|:-:|:-:|
|5.0.0|〇| 〇  | 〇  |
|5.1.0|〇| 〇  | 〇  |
|5.2.2|  〇 | 〇  | 〇  |
|5.2.3| 〇  |  〇 | 〇 |
|5.3.0| ×  | 〇  | ×  |
|5.3.1| ×  | 〇  | ×  |
|5.3.2| ×  | 〇  | ×  |
|5.3.3| ×  | 〇  | ×  |
|5.3.4| ×  | 〇  | ×  |
|5.4.0| ×  | 〇  | ×  |

### Microsoft.NETCore.UniversalWindowsPlatformのバージョン毎の違い
Microsoft.NETCore.UniversalWindowsPlatform 5.2.3以降とそれ以前は根本的に構造が違うような。。。
Github([https://github.com/Microsoft/dotnet/tree/master/releases/UWP](https://github.com/Microsoft/dotnet/tree/master/releases/UWP))でUWP関連のリリースノートを色々みても5.2.xまでしか表記がないといった感じです。

| Microsoft.NETCore.UniversalWindowsPlatformのバージョン | .NET Nativeバージョン|
|:-:|:-:|
|5.2.X|.NET Native 1.4| 
|5.3.X|.NET Native 1.6|
|5.4.X|.NET Native 1.7|

Microsoft.NETCore.UniversalWindowsPlatform 5.0.0や5.1.0等のライブラリを色々たどっていくと、5.2.0以降では存在する.NET Standardへの依存関係がなかったりするので、5.2.X以降で内部構造が変わっていることがバージョン混在(5.2.3+5.0.0)でデプロイ後動かすとうまく行かない原因になってるようですね。

(参考)Microsoft.NETCore.UniversalWindowsPlatformで参照するによるSystem.Runtime.WindowsRuntimeの依存性の違い

| 5.1.0,5.0.0 | 5.2.3 |
|:-:|:-:|
| [https://www.nuget.org/packages/System.Runtime.WindowsRuntime/4.0.10](https://www.nuget.org/packages/System.Runtime.WindowsRuntime/4.0.10) |[https://www.nuget.org/packages/System.Runtime.WindowsRuntime/4.0.11](https://www.nuget.org/packages/System.Runtime.WindowsRuntime/4.0.11) |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/ca0acc11-ec7b-2bbd-5942-39fdd17dbec3.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/b72245ed-4e96-1026-6882-3b46d89c756e.png)|