最近WindowsアプリはFormアプリケーションを捨て、WPFで開発することが多いです。しかしEmbedded関係の仕事が多いこともありBluetoothLEを用いるアプリを依頼される事もあります。
みなさんWPFやFormアプリケーションでBluetoothLE APIが使えないためにNuGetで「UwpDesktop」をインストールしたりする事が多いと思います。しかし更新されていないプロジェクトですから新しいAPIは使えません。
「GattDeviceServicesResult」が使えないんだよ!!と困っている人もよく見かけますよね。“GattDeviceServicesResult” can not be found
で、結論がUWPやRT用のAPIなんだから使えなくて当然だよ。ではWPFアプリで途中まで仕上げたのに何してくれてんじゃい!となるわけです。
Microsoftもトピックとして「デスクトップ アプリに利用可能な UWP Api」を紹介していますが、全てのAPIは使えないものの利用できるAPIも多そうです。このリストにないから使えない?とは限りません。
今回はたまたまstack overflowで見つけた問題を解決してみたいと思います。
【解決方法】※WPFでBLEのGattDeviceServicesResultを使いたい!!
1.まずはプロジェクト全体のバッグアップをとっておいてください。
2.プロジェクトをアンロードします。
3.プロジェクトを編集します。
4.TargetPlatformVersionを追記します。
5.プロジェクトを再読み込みします。
6.参照の追加をクリックします。
7.参照に対象のWindows.winmdを追加します。
例:Windows 10(10.0.17763.0)を対象とする場合
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd
8.参照に対象のSystem.Runtime.WindowsRuntime.dllを追加します。
例:Windows 10(.NETCore V4.5)を対象とする場合
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
※4.5.1じゃなく4.5です。
Async周りでエラーがまだ出る場合は
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5/System.Runtime.InteropServices.dll
も追加してみてください。
9.解決GattDeviceServicesResult使えるようになったでしょう?
ね?簡単でしょう。
BluetoothLE APIだけでなく色んなものを利用できますよ。応用してみてください。お疲れ様でした。
今回の作業で使えるようになったAPI一覧
・BluetoothLEDevice(GetGattServicesAsync/ConnectionStatusChanged/FromIdAsync)
・GattCharacteristic(ValueChanged/WriteClientCharacteristicConfigurationDescriptorAsync/ReadClientCharacteristicConfigurationDescriptorAsync)
・GattDeviceServicesResult(GetGattServicesAsync/Services)
・GattDeviceService(GetCharacteristicsAsync)