痛IDE拡張機能を作ってみた

HTML書くの面倒で試しにということでGoogleサイトに。
http://sites.google.com/site/unalabo/home/oucheditor
中身はそっちを見てもらうとして、今回の成果。

初!MEFでの拡張機能作成

まねーじどえくすてんしびりてぃふれーむわーく、という物だそうです。
別にVSアドインに限ったことではなく、マネージドアプリケーションの機能拡張を簡単にするフレームワークらしい。

MEFではインターフェースと実装を分離し、プログラムの拡張性を高める事が出来ます。インターフェースと実装の分離する仕組みとしては「DI(Dependency Injection)コンテナー」が有名です。.NET開発では「Seaser.NET」や「Spling.NET」等が有名です。MEFは.NET版のDIコンテナと理解頂ければ初めは問題ないと思います。

Managed Extensibility Framework(MEF)入門 -MEFとは- - .NETな日々 -EX-

いまいちピンと来てないですが、インターフェイスを実装しただけで拡張ができて不思議なまでに簡単ではありました。(逆に凝ったことはできない)

設定管理クラス作ってみた

今まで設定は.configやIDE統合で有名なApplicationSettingBaseのくだりばかり使っていたんですが、今回それを使おうとしたら思わぬ事態に。
あれは設定ファイルのパスは自動生成されて基本的に変更できないのですが、なにから自動生成されるのかと思ったら実行ファイルのアセンブリ情報だったらしいのです。VSの機能拡張でそれをやると、/Users/**/AppData/Roaming/Microsoft Corporation/Microsoft...と機能拡張のアイデンティティから遠く離れたところに置かれてしまいました。
さすがにそれは管理も面倒なので、ということでXmlSerializerを使った設定管理クラスを新たに書きました。適当にシングルトンで作ったけどちゃんと動いているようでよかった。
で、今回の要のコードがこちら。

Path.GetFullPath(Path.Combine(Application.UserAppDataPath, @"..\..\..\unarist\OuchEditor\"))

/Users/**/AppData/Roaming/を指すプロパティでもあればいいのに・・・

細かい話

  • new XmlSerializer(File.OpenWrite(...))とかやったらFileStreamがクローズされないかもなーと思ったら見事にクローズされてなかった
  • てっきりFactoryクラスは起動時にインスタンス生成されるものと思っていたら、最初にエディタを開いたときだったという
  • TextViewCreatedでMessageBox使うと悲惨なことになった→Dispatcher.BeginInvokeで遅延させて解決
  • 優先順位の通りに割り込ませてくれるDispatcherすごい!イケメン!
  • ライセンス文をVSから書こうとしたらデフォルトのエンコードSJISで、直したと思ったらUTF16で、結局秀丸で直したという