Roslyn + KanColleViewer

Da5ad051bd594c29c3ddd5ba80327779?s=47 Grabacr07
September 16, 2015

Roslyn + KanColleViewer

Metro.cs #1 https://roommetro.doorkeeper.jp/events/30482 のセッション資料。
* KanColleViewer で Roslyn を使うに至った理由と、Roslyn の意義 👈 この資料
* KanColleViewer で使ったアナライザー実装の解説 👈 http://www.cat-ears.net/?p=40544

Da5ad051bd594c29c3ddd5ba80327779?s=128

Grabacr07

September 16, 2015
Tweet

Transcript

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

  2. Agenda Road to Roslyn - @Grabacr07 KanColleViewer が Roslyn に頼る理由

    Roslyn とは (雑に) Feature of Roslyn - @veigr Analyzer with Code Fix の概要 実際に作ったプラグインの実装について
  3. Self Introduction 亀谷学人 (かめやまなと) / 1987年生まれ / 仙台出身 / 東京在住

    Work 2010/04 - 2014/07 … 某メーカー系 SIer C# + WPF (Windows Client Application) 2014/09 - 現在 … 株式会社グラニ C# + Unity (Game app), C# + WPF (Tools)
  4. 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/
  5. Roslyn 使うに至るまで Road to Roslyn

  6. KanColleViewer Windows Desktop app .NET Framework 4.5 Visual C# +

    WPF 艦これプレイングツール 内蔵ブラウザー Internet Explorer Shell ネットワーク キャプチャ
  7. Derived versions… 加速するフォーク数

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

  9. Derived versions… 加速するフォーク数 ローカライズ版 機能追加版 例: データ送信機能を付加 Server Profile Server

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

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

    統計データ ・ドロップ情報 ・戦闘情報 ・etc… ユーザー トークン等 全部そのまま丸投げ… …というあやしいものが KanColleViewer 名乗ってる… 比較的簡単な機能追加程度であれば、 本体改造しなくても組み込めるようにしたい
  12. 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<Lazy<IPlugin, IPluginMetadata>> importedAll; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<ISettings, IPluginGuid>> importedSettings; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<INotifier, IPluginGuid>> importedNotifiers; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<ITool, IPluginGuid>> importedTools; Plugin side KanColleViewer side
  13. 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<Lazy<IPlugin, IPluginMetadata>> importedAll; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<ISettings, IPluginGuid>> importedSettings; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<INotifier, IPluginGuid>> importedNotifiers; [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy<ITool, IPluginGuid>> importedTools; Plugin side KanColleViewer side プラグイン要件 特定のインターフェイスを実装 その型の ExportAttribute が必要 特定のメタデータ実装が必要
  14. Plugin system 機能追加をプラグインで MEF (Microsoft Extensibility Framework) 追加機能を DLL で配布できる形へ

    だがしかし Developer unfriendly 非人道的難易度を要求される… プラグインを作るには 本体のソース コードを読む インターフェイスを理解する KanColleViewer.exe を参照する の 3 つをクリアする プラグイン要件 特定のインターフェイスを実装 その型の ExportAttribute が必要 特定のメタデータ実装が必要
  15. Developer friendly 各開発ステップの人道性を インターフェイス (機能)を理解 ドキュメント整備 KanColleViewer.exe を参照 DLL 化し

    NuGet 配布 特定のインターフェイスを実装 その型の ExportAttribute を実装 特定のメタデータ定義を実装 • 開発に直結 • ライブラリ固有の事情 Roslyn で解決
  16. Roslyn .NET Compiler Platform ホワイトボックス化されたプラットフォーム コード解析機能に API アクセスできる (= 解析機能を作れる)

    標準で提供できずとも、作れる • チーム内のローカル ルール • ライブラリ固有の事情 標準で提供されている解析機能もあるが…
  17. Roslyn Core-Aware Library 「ライブラリ自身が利用側のコードを理解する」 … ことによって、問題点の検出や修正まで提供 特定のインターフェイスを実装 その型の ExportAttribute を実装

    特定のメタデータ定義を実装 特定用途向けのコード解析 Roslyn の正しい使い方
  18. Conclusion Plugin system の搭載 DLL で KanColleViewer の機能を拡張できるようにした MEF で作るため実装に決まりごとがあり、面倒&難しさ

    Code-Aware Library Roslyn で実現する「ライブラリ固有の事情」向けの拡張 プラグインの要件を満たすよう、問題の検出&修正機能