Metro.cs #1 https://roommetro.doorkeeper.jp/events/30482 のセッション資料。 * KanColleViewer で Roslyn を使うに至った理由と、Roslyn の意義 👈 この資料 * KanColleViewer で使ったアナライザー実装の解説 👈 http://www.cat-ears.net/?p=40544
Roslyn+ KanColleViewer2015/09/16 Metro.cs #1Manato KAMEYA (@Grabacr07)
View Slide
AgendaRoad to Roslyn - @Grabacr07KanColleViewer が Roslyn に頼る理由Roslyn とは (雑に)Feature of Roslyn - @veigrAnalyzer with Code Fix の概要実際に作ったプラグインの実装について
Self Introduction亀谷学人 (かめやまなと) / 1987年生まれ / 仙台出身 / 東京在住Work2010/04 - 2014/07 … 某メーカー系 SIerC# + WPF (Windows Client Application)2014/09 - 現在 … 株式会社グラニC# + Unity (Game app), C# + WPF (Tools)
Self Introduction亀谷学人 (かめやまなと) / 1987年生まれ / 仙台出身 / 東京在住PrivateRoom metro Tokyo (めとべや東京勉強会) staff提督業も忙しい! (KanColleViewer) 開発Microsoft MVP for Visual C# (2014/04 - 2016/03)Twitter: @Grabacr07Facebook: manato.kameyaBlog: http://grabacr.net/
Roslyn 使うに至るまでRoad to Roslyn
KanColleViewerWindows Desktop app.NET Framework 4.5Visual C# + WPF艦これプレイングツール内蔵ブラウザーInternet Explorer Shellネットワーク キャプチャ
Derived versions…加速するフォーク数
Derived versions…加速するフォーク数ローカライズ版機能追加版英語、中国語、フランス語、etc…あなた方の国ではプレイできないはずでは…
Derived versions…加速するフォーク数ローカライズ版機能追加版例: データ送信機能を付加ServerProfileServer統計データ・ドロップ情報・戦闘情報・etc…
Derived versions…加速するフォーク数ローカライズ版機能追加版例: データ送信機能を付加ServerProfileServer統計データ・ドロップ情報・戦闘情報・etc…ユーザー トークン等全部そのまま丸投げ……というあやしいものがKanColleViewer 名乗ってる…
Derived versions…加速するフォーク数ローカライズ版機能追加版例: データ送信機能を付加ServerProfileServer統計データ・ドロップ情報・戦闘情報・etc…ユーザー トークン等全部そのまま丸投げ……というあやしいものがKanColleViewer 名乗ってる…比較的簡単な機能追加程度であれば、本体改造しなくても組み込めるようにしたい
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 sideKanColleViewer side
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 sideKanColleViewer sideプラグイン要件特定のインターフェイスを実装その型の ExportAttribute が必要特定のメタデータ実装が必要
Plugin system機能追加をプラグインでMEF (Microsoft Extensibility Framework)追加機能を DLL で配布できる形へだがしかしDeveloper unfriendly非人道的難易度を要求される…プラグインを作るには本体のソース コードを読むインターフェイスを理解するKanColleViewer.exe を参照するの 3 つをクリアするプラグイン要件特定のインターフェイスを実装その型の ExportAttribute が必要特定のメタデータ実装が必要
Developer friendly各開発ステップの人道性をインターフェイス (機能)を理解 ドキュメント整備KanColleViewer.exe を参照 DLL 化し NuGet 配布特定のインターフェイスを実装その型の ExportAttribute を実装特定のメタデータ定義を実装• 開発に直結• ライブラリ固有の事情Roslyn で解決
Roslyn.NET Compiler Platformホワイトボックス化されたプラットフォームコード解析機能に API アクセスできる (= 解析機能を作れる)標準で提供できずとも、作れる• チーム内のローカル ルール• ライブラリ固有の事情標準で提供されている解析機能もあるが…
RoslynCore-Aware Library「ライブラリ自身が利用側のコードを理解する」… ことによって、問題点の検出や修正まで提供特定のインターフェイスを実装その型の ExportAttribute を実装特定のメタデータ定義を実装特定用途向けのコード解析Roslyn の正しい使い方
ConclusionPlugin system の搭載DLL で KanColleViewer の機能を拡張できるようにしたMEF で作るため実装に決まりごとがあり、面倒&難しさCode-Aware LibraryRoslyn で実現する「ライブラリ固有の事情」向けの拡張プラグインの要件を満たすよう、問題の検出&修正機能