すごくニッチなネタなのだが、せっかくなので投稿しておく。
Microsoft Small Basic 用の拡張ライブラリを実装する際の話題。
Small Basic についておさらい
ちなみに Small Basic とは、Microsoft から提供されている、無償利用可能なプログラミング言語およびその開発環境である。
Microsoft Small Basic
http://smallbasic.com/
もっぱらプログラミングの学習・教育用として謳われているが、実は状況によっては実務にも使えるおもしろい処理系である。
参照: 過去の投稿
「Small Basic を実務で使ってみませんか?」
http://devadjust.exblog.jp/13258395/
この Small Basic、C# などの .NET 言語でふつうにクラスライブラリを作って配置するだけで、自前の機能を追加することが容易にできる。
参照: 過去の投稿
「Small Basic を C# で拡張する & 配列を返すには?」
http://devadjust.exblog.jp/12758592/
拡張ライブラリではアプリ終了時の後始末ができない?
さてこの Small Basic 用の拡張ライブラリの実装だが、正味はひたすら static メソッド・static プロパティを実装、public で公開するだけである。
難しいことは大してない。
ところが、である。
Small Basic 用拡張ライブラリは static メソッド・プロパティの塊でしかない。
そのため、アプリケーション終了時に何か後始末の処理を行う、というのが難しいのだ。
非static なクラスのインスタンスであれば、IDisposable を実装しておいて、呼び出しもとの責任で破棄してもらうとか、最悪、ファイナライザでなにかするとか、手段がありそうなものだ。
ところがなにせ static クラスでしかないので、拡張ライブラリそれ自身では、アプリケーションのライフサイクルを知る手立てがないのだ。
これは特に、COM サーバーなど非マネージドなリソースの解放をアプリ終了時に行いたい場合に致命的である。
Dispatcher クラスの ShutdownStarted イベント
ということで八方手を尽くして調べてみたら、アプリケーション終了時のイベントというものを発見。
System.Windows.Threading.Dispatcher クラスの ShutdownStarted イベントだ。
WPF 界隈では常識なのかもしれないが...。
すなわち、Small Basic 拡張ライブラリの実装において、下記のコードでアプリケーション終了時の処理を書くことができる。
using System.Windows;
...
Application.Current.Dispatcher.ShutdownStarted
+= Dispatcher_ShutdownStarted;
...
static void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
// ここでアプリ終了時の後始末処理を行う
}
以上、Small Basic というだけでもニッチなネタだと思うが、それに輪を掛けて、拡張ライブラリの、しかもアプリ終了時の後始末処理の話題。
よろしければ
他の #Small Basic タグの投稿もあわせてどうぞ。