Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Roslyn + KanColleViewer

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

Grabacr07

September 16, 2015
Tweet

More Decks by Grabacr07

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  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/

    View Slide

  5. Roslyn 使うに至るまで
    Road to Roslyn

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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> 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

    View Slide

  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> 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 が必要
    特定のメタデータ実装が必要

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide