Developing Plugin for Krile(1)

全n回でお送りする、「くるるのプラグインを作ろうじゃないか」の記事。

まずはくるるのプラグイン仕様について。

Krileのプラグインとは

Krileのプラグインは主にC#で書かれ、MEFを通してロードされます。(VBでも書けるのかな?)

plugin.dll に含まれる Acuerdo.Plugin.IPlugin インターフェイスを実装し、それをMEFで公開する必要があります。

IPlugin は以下の通り。

using System;

namespace Acuerdo.Plugin
{
    ///  /// Krile2 プラグインインターフェイス /// 
    public interface IPlugin
    {
        ///  /// プラグインの名前を取得します。 /// 
        string Name { get; }

        ///  /// プラグイン バージョンを取得します。 /// 
        Version Version { get; }

        ///  /// プラグインがロードされたことを通知します。 /// 
        void Loaded();

        ///  /// 設定UIプロバイダインターフェイスを取得します。 /// 
        /// 
        IConfigurator ConfigurationInterface { get; }

    }
}

Nameはプラグイン名、Versionはプラグインバージョンを返します。

Loaded は、プラグインがロードされた時にコールされます。後述。

ConfigurationInterfaceは、設定インターフェイスを返すようにするとKrileの設定ダイアログから設定を呼び出せるようになります。設定ダイアログが無いときはnullを返してかまいません。後述。

Acuerdo/Dulcet/Inscribe/Livet

Krileは複数のモジュールから構成されます。

Acuerdo: プラグイン実装に必要なインターフェイス等のモジュール (plugin.dll)

Dulcet: Twitterへの通信を行うモジュール (network.dll)

Inscribe: Krileのコアシステム (core.dll)

Livet: UI用 MVVMインフラストラクチャ (Livet.dll)

この4つをロードしておけばまずまず大丈夫だと思います。

Loadedまわりのこと

Loadedでプラグインがコールされたとき、まだKrileのシステムは完全に初期化が完了しているわけではありません。

Krileの起動シーケンスは、

  • Dulcet.Network のパラメータ設定
  • プラグインのロード (← Loaded はここでコールされる)
  • 設定のロード
  • サブシステム初期化(各種ストレージ系など)
  • 更新確認
  • ウィンドウ表示、タイムラインの構築
  • AutoCruiseスタート

の順で行われます。(Inscribe.Core.Initializer.cs 参照)

つまり、Loadedされた状態でKrileの設定値とか読みに行くと落ちたりします。

Krileが完全に起動した時にコールバックしてほしい場合、

event Action Inscribe.Core.OnStandbyApp

をリッスンします。

Inscribe.Core.OnStandbyApp += () => { ... }

Loadedですべきこと/OnStandbyAppですべきこと

Krileのコアシステムへのデータ登録はLoadedでするべきです。

  • フィルタの登録
  • キーアサインの登録
  • メニューの登録(2.4.4 以前ではOnStandbyAppで行わないと落ちましたが改善されました)
  • Injection(後述)←場所によってはOnStandbyAppじゃないと落ちるかも

以下のことはOnStandbyAppで行わなければなりません。

  • 設定値のロード
  • UIを弄る

Loadedでやってみて、Krileが落ちるようならOnStandbyAppでする、という方法が一番確実だとおもいますごめんねてへぺろ(ゝω・)v

Injection

Krileには各所にInjection Pointが設けられています。

要するに、Krileで実装されている動作を動的にオーバーライド可能にするものです。

Acuerdo.Injection 名前空間にインターフェイスなどが存在します。

例えば、Tweetをオーバーライドする場合、

Inscribe.Communication.Posting.PostOffice.UpdateInjection.Injection(...)

メソッドを呼び出します。

Injectionはちとコツがいるので、また次回にでも。

ConfigurationInterface

設定インターフェイスは、IConfigurator を返す必要があります。

また、設定インターフェイスを提供する際にはSystem.Windowsなど、UI系dllへの一通りの参照が必要になります。(Window GetTransitionWindowの戻り値がWindowのため)

UIの構築にはLivetを用いたMVVMパターンの適用をお勧めします。ま、でも、プラグインなら小規模ですし何で書いても別に大丈夫です。

そのほか

Krileは割と頻繁に更新されるため、プラグインが追い付くのがつらいです。

というか僕もSookIkemenプラグインとかほんと放置しっぱなしでごめんなさい泣いてます

がんばってね☆

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です