2011年10月19日水曜日

外部ライブラリの動的読み込み(仮)

Visual Studio 上で行っている分には自動で参照設定を行った Dll からアクティビティをツールボックスに追加、リソースの読み込み等を行ってくれているので、特に心配する事はないのですが、リホスティングデザイナにてこれを行う場合、少し気を付ける必要があります。

ライブラリの読み込みは、他 AP の場合と同様にリフレクションを用いて行う方法を利用します。WF のリホスティングデザイナの場合、この後に少し追加作業が発生します。

まず大前提というか今のところ対応方法がわかっていない点として、リホスティングデザイナアプリのアセンブリと同一のフォルダに、プラグイン用 Dll が必要になります。

そして Dll を Reflection.Assembly.LoadFrom 等で読み込み、Assembly クラスのインスタンスとして取得、その後 Metadata を登録する必要があります。WF では Metadata としてアクティビティデザイナやアイコンなどのリソースを登録する必要があり、Dll の読み込みだけではこの部分が行われません。Metadata に登録しない状態でアクティビティをデザイナにドロップすると、アクティビティデザイナが表示されない状態となります。

   1: Dim meta = childAsm.GetTypes().Where(Function(t)
   2:                                          Return GetType(Metadata.IRegisterMetadata).IsAssignableFrom(t)
   3:                                      End Function)
   4: For Each childMeta In meta
   5:     If Not _addLibrary.Contains(childAsm) Then
   6:         _addLibrary.Add(childAsm)
   7:     End If
   8:     Dim metadata = TryCast(Activator.CreateInstance(childMeta), Metadata.IRegisterMetadata)
   9:     If metadata IsNot Nothing Then
  10:         metadata.Register()
  11:     End If
  12: Next

ロジックとしては大体このような感じで対応できると思います。IRegistaerMetadata インターフェースを継承したクラスでは、Metadata を登録するためのメソッドが用意されているのでそれを実行します。

ただし、この方法では DesignerAttribute 属性を利用した関連付けを行っている場合には対応できませんので、別の方法にて行ってあげる必要があるようです。このあたりはまた分かりしだい記載していきたいと思います。

0 件のコメント:

コメントを投稿