Slide 1

Slide 1 text

Roslyn + KanColleViewer 2015/09/16 Metro.cs #1 Manato KAMEYA (@Grabacr07)

Slide 2

Slide 2 text

Agenda Road to Roslyn - @Grabacr07 KanColleViewer が Roslyn に頼る理由 Roslyn とは (雑に) Feature of Roslyn - @veigr Analyzer with Code Fix の概要 実際に作ったプラグインの実装について

Slide 3

Slide 3 text

Self Introduction 亀谷学人 (かめやまなと) / 1987年生まれ / 仙台出身 / 東京在住 Work 2010/04 - 2014/07 … 某メーカー系 SIer C# + WPF (Windows Client Application) 2014/09 - 現在 … 株式会社グラニ C# + Unity (Game app), C# + WPF (Tools)

Slide 4

Slide 4 text

Self Introduction 亀谷学人 (かめやまなと) / 1987年生まれ / 仙台出身 / 東京在住 Private Room metro Tokyo (めとべや東京勉強会) staff 提督業も忙しい! (KanColleViewer) 開発 Microsoft MVP for Visual C# (2014/04 - 2016/03) Twitter: @Grabacr07 Facebook: manato.kameya Blog: http://grabacr.net/

Slide 5

Slide 5 text

Roslyn 使うに至るまで Road to Roslyn

Slide 6

Slide 6 text

KanColleViewer Windows Desktop app .NET Framework 4.5 Visual C# + WPF 艦これプレイングツール 内蔵ブラウザー Internet Explorer Shell ネットワーク キャプチャ

Slide 7

Slide 7 text

Derived versions… 加速するフォーク数

Slide 8

Slide 8 text

Derived versions… 加速するフォーク数 ローカライズ版 機能追加版 英語、中国語、フランス語、etc… あなた方の国ではプレイできないはずでは…

Slide 9

Slide 9 text

Derived versions… 加速するフォーク数 ローカライズ版 機能追加版 例: データ送信機能を付加 Server Profile Server 統計データ ・ドロップ情報 ・戦闘情報 ・etc…

Slide 10

Slide 10 text

Derived versions… 加速するフォーク数 ローカライズ版 機能追加版 例: データ送信機能を付加 Server Profile Server 統計データ ・ドロップ情報 ・戦闘情報 ・etc… ユーザー トークン等 全部そのまま丸投げ… …というあやしいものが KanColleViewer 名乗ってる…

Slide 11

Slide 11 text

Derived versions… 加速するフォーク数 ローカライズ版 機能追加版 例: データ送信機能を付加 Server Profile Server 統計データ ・ドロップ情報 ・戦闘情報 ・etc… ユーザー トークン等 全部そのまま丸投げ… …というあやしいものが KanColleViewer 名乗ってる… 比較的簡単な機能追加程度であれば、 本体改造しなくても組み込めるようにしたい

Slide 12

Slide 12 text

Plugin system 機能追加をプラグインで MEF (Microsoft Extensibility Framework) 追加機能を DLL で配布できる形へ [Export(typeof(IPlugin))] [Export(typeof(ITool))] [ExportMetadata("Title", "KanColleCounter")] [ExportMetadata("Description", "Simply counter")] [ExportMetadata("Version", "1.1")] [ExportMetadata("Author", "@Grabacr07")] public class KanColleCounter : IPlugin, ITool { // ... } [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedAll; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedSettings; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedNotifiers; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedTools; Plugin side KanColleViewer side

Slide 13

Slide 13 text

Plugin system 機能追加をプラグインで MEF (Microsoft Extensibility Framework) 追加機能を DLL で配布できる形へ [Export(typeof(IPlugin))] [Export(typeof(ITool))] [ExportMetadata("Title", "KanColleCounter")] [ExportMetadata("Description", "Simply counter")] [ExportMetadata("Version", "1.1")] [ExportMetadata("Author", "@Grabacr07")] public class KanColleCounter : IPlugin, ITool { // ... } [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedAll; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedSettings; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedNotifiers; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable> importedTools; Plugin side KanColleViewer side プラグイン要件 特定のインターフェイスを実装 その型の ExportAttribute が必要 特定のメタデータ実装が必要

Slide 14

Slide 14 text

Plugin system 機能追加をプラグインで MEF (Microsoft Extensibility Framework) 追加機能を DLL で配布できる形へ だがしかし Developer unfriendly 非人道的難易度を要求される… プラグインを作るには 本体のソース コードを読む インターフェイスを理解する KanColleViewer.exe を参照する の 3 つをクリアする プラグイン要件 特定のインターフェイスを実装 その型の ExportAttribute が必要 特定のメタデータ実装が必要

Slide 15

Slide 15 text

Developer friendly 各開発ステップの人道性を インターフェイス (機能)を理解 ドキュメント整備 KanColleViewer.exe を参照 DLL 化し NuGet 配布 特定のインターフェイスを実装 その型の ExportAttribute を実装 特定のメタデータ定義を実装 • 開発に直結 • ライブラリ固有の事情 Roslyn で解決

Slide 16

Slide 16 text

Roslyn .NET Compiler Platform ホワイトボックス化されたプラットフォーム コード解析機能に API アクセスできる (= 解析機能を作れる) 標準で提供できずとも、作れる • チーム内のローカル ルール • ライブラリ固有の事情 標準で提供されている解析機能もあるが…

Slide 17

Slide 17 text

Roslyn Core-Aware Library 「ライブラリ自身が利用側のコードを理解する」 … ことによって、問題点の検出や修正まで提供 特定のインターフェイスを実装 その型の ExportAttribute を実装 特定のメタデータ定義を実装 特定用途向けのコード解析 Roslyn の正しい使い方

Slide 18

Slide 18 text

Conclusion Plugin system の搭載 DLL で KanColleViewer の機能を拡張できるようにした MEF で作るため実装に決まりごとがあり、面倒&難しさ Code-Aware Library Roslyn で実現する「ライブラリ固有の事情」向けの拡張 プラグインの要件を満たすよう、問題の検出&修正機能