FlashDevelop のプラグインで、
MultiView というのを見つけた。
ひとつの as を2ウィンドウで表示できるそうで、縦に長いソースの離れた箇所を参照するのに便利そうだ。(実際には、2つ以上開くことができるようだ。その操作をしてる動画があったw)
ところが、この MultiView、FlashDevelop 3 では、ちゃんと動くのに、最近リリースされた 4 だと、load できずエラーになる。
ためしに、
ソースも落として、エラーを消せないか、四苦八苦。
環境の準備などは、
プラグインのつくりかたをご参照ください。
しかし、このとおりにやっても、今度は、MultiView のプロジェクトのビルドで、エラー
エラー 1 'MultiView.PluginMain' はインターフェイス メンバ 'PluginCore.IPlugin.Api' を実装しません。 ・・・・MultiView\PluginMain.cs 22 15 MultiView
どうやら、MultiView のメインの PluginMain は、インターフェイス として、PluginCore の IPlugin を利用しているようだが、Api の本体を実装していないみたい。
ためしに、PluginMain.cs を見てみると、たしかに、private 変数としての Api もないし、外部から Api 変数を利用するための public 変数の Api も書かれていない。
で、適当に
private Int32 pluginApi = 0;
と
public Int32 Api
{
get { return this.pluginApi; }
}
を書き足してみた。
Api を Int32 にしたのは、PluginCore の Interfaces.cs に Int32 Api { get; } とあったから。
これで、ビルドは、ちゃんとできるようになって、ためしに、FlashDevelop.exe を起動してみると、
今度は、「Unable to load an incompatible plugin ・・・・MultiView.dll」と出てきた。
理由がわからないので、"Unable to load an incompatible plugin" で、FlashDevelop のソース内を grepしてみた。
すると、"Unable to load an incompatible plugin" は、 PluginCore\Resources\en_US.resX で、"FlashDevelop.Info.UnableToLoadPlugin" と定義されていることがわかった。
今度は、"UnableToLoadPlugin" で、ソースを探しまくると、Utilities\PluginServices.cs で
catch (Exception ex)
{
String message = TextHelper.GetString("Info.UnableToLoadPlugin");
ErrorManager.ShowWarning(message + " \n" + fileName, ex);
}
としていることがわかった。
これは、その前にある
if (newPlugin.Instance.Api != REQUIRED_API_LEVEL)
{
// Invalid plugin, ignore...
throw new Exception("Required API level does not match.");
}
で、発生している例外エラーによるものだから、Api の値が REQUIRED_API_LEVEL と等しければ、発生しないことがわかった。
んで、REQUIRED_API_LEVEL の値は、
public static Int32 REQUIRED_API_LEVEL = 1;
だった。
そのため、
MultiView の PluginMain.cs で書いた
private Int32 pluginApi = 0;
を
private Int32 pluginApi = 1;
にしてみた。
すると、問題なく FlashDevelop.exe は起動し、ソース内を右クリックすると、ちゃんと CloneView が表示され、ちゃんとソースが2枚の画面に分かれて表示できた!!
やったぁ!!
やれば、できんじゃん。
はたして、この方法がちゃんとしたものなのかは、よくわからないが、個人的には、動くので、よしとしよう。
めでたし、めでたし。