2011年10月21日金曜日

アイコン等のリソースと IRegisterMetadata

前回の記事で、外部ライブラリを動的に読み込みそのリソースを登録する際に、IRegisterMetadata.Register メソッドを呼ぶ、というものを書きました。この方法は現時点で Microsoft としても推奨している方法です。アイコンやアクティビティデザイナ等、今までは属性を利用して設定していたのですが、この方法であれば別 Dll に分離することができるようになります。WPF ではよく見かける形ですが、WF においても同様の方法を用います。

なお、ここで言う IRegisterMetadata インターフェースは System.Activities.Presentation.Metadata 名前空間に属するもので、WPF で利用する Microsoft.Windows.Design.Metadata 名前空間に属する同一名称のインターフェースとは別になります。

実際の実装ですの流れは次のようになります。

  1. アクティビティ用 DLL プロジェクト、デザイナー用 DLL プロジェクトを用意する。この時デザイナー用プロジェクトのアセンブリ名を [ (アクティビティ用アセンブリ名).design.dll ] となるように設定する
  2. デザイナー用プロジェクトがアクティビティ用プロジェクトを参照するよう設定
  3. デザイナー用プロジェクトに IRegisterMetadata インターフェースを継承した Metadata 登録用クラスを用意
  4. Rejister メソッド内部で AttributeTableBuilder クラスを用いてメタデータの登録を行う

アクティビティ側ではデザイナなどのリソースを一切意識しないのがポイントです。またデザイナー用 DLL に *.design.dll と特定の名前を付けるのですが、この命名ルールは .NET におけるメタデータアセンブリ検索ルールに基づいています。

アクティビティとデザイナーの実装を行い、アイコン等のリソースも登録した後に、メタデータ登録用のロジックを作成する事になります。クラス名はどのような名称でも構いません。

   1: Imports System.ComponentModel
   2: Imports System.Activities.core.presentation
   3: Imports System.Activities.Presentation.Metadata
   4:  
   5: Public Class Metadata
   6:     Implements IRegisterMetadata
   7:  
   8:     Public Sub Register() Implements System.Activities.Presentation.Metadata.IRegisterMetadata.Register
   9:  
  10:         Dim metadata As New DesignerMetadata
  11:         metadata.Register()
  12:  
  13:         Dim builder As New AttributeTableBuilder
  14:         builder.AddCustomAttributes(GetType(SampleActivity), 
  15:                                New DesignerAttribute(GetType(SampleActivityDesigner)))
  16:         MetadataStore.AddAttributeTable(builder.CreateTable)
  17:  
  18:     End Sub
  19:  
  20: End Class

大体このようなロジックになります。実装する内容としては、今まで属性で記述していた内容を AttibuteTableBuilder を用いてカスタム属性として登録する部分になります。上記ロジックではアクティビティデザイナーの登録を DesignerAttribute で行っています。これがツールボックスのアイコンであれば、ToolboxBitmapAttribute を利用して設定を行います。

このような形で実装をすることで、VS 上ではアクティビティ用 Dll が呼び出された際に自動で検索されメタデータ登録が行われるようになります。リホスティングデザイナの場合は、呼び出すロジックを自前で用意する必要があります。

0 件のコメント:

コメントを投稿