カスタム コントロールとデザイン時アセンブリの配置
デザイン ツールでは、カスタム コントロールのアセンブリが開くと、関連付けられているデザイン時アセンブリも検索します。 特に、デザイナーでは、ProvideMetadataAttribute アセンブリ レベル属性を持つアセンブリを検索します。 この属性が見つかると、デザイナーで IProvideAttributeTable インターフェイスを実装するクラスのアセンブリを検索します。 デザイナーでは、デザイン時の動作を指定する属性コレクションに対してこのクラスの AttributeTable プロパティを照会します。
デザイン時アセンブリの名前付け規則
Design tools, such as Visual Studio や Expression Blend などのデザイン ツールでは、名前付け規則を使用して、カスタムのデザイン時アセンブリを検出します。 この規則は、さまざまなツールのバージョンに展開されています。 次の表を使用して、該当する対象デザイナーのアセンブリの名前を付けます。
対象の環境 |
名前付け規約 |
名前の例 |
---|---|---|
Expression Blend 3 および Visual Studio 2010 |
<ControlLibrary>.Design.<バージョン>.dll (共通) <ControlLibrary>.Expression.Design.<バージョン>.dll (Expression Blend) <ControlLibrary>.VisualStudio.Design.<バージョン>.dll (Visual Studio) |
TailspinToysControls.Design.4.0.dll TailspinToysControls.Expression.Design.4.0.dll TailspinToysControls.VisualStudio.Design.4.0.dll |
Expression Blend 2 および Visual Studio 2008 |
<ControlLibrary>.Design.dll (共通) <ControlLibrary>.Expression.Design.dll (Expression Blend) <ControlLibrary>.VisualStudio.Design.dll (Visual Studio) |
TailspinToysControls.Design.dll TailspinToysControls.Expression.Design.dll TailspinToysControls.VisualStudio.Design.dll |
共通は、Visual Studio および Expression Blend によって共有されるデザイン時実装を参照します。 <バージョン> 部分文字列には、対応する WPF デザイナー フレームワークのバージョンを指定します。 これを確認するには、Microsoft.Windows.Design.dll アセンブリのバージョンを調べます。
ツール固有のデザイン時アセンブリは、共通アセンブリの共有実装をオーバーライドできます。 つまり、さまざまなデザイン ツールによって、カスタム デザイン環境が大幅に異なる可能性があります。 詳細については、「デザイン時メタデータの提供」を参照してください。
デザイン時アセンブリの登録
AssemblyFoldersEx 登録という名前のアセンブリ フォルダー登録プロシージャを使用して、コントロールとそれに関連付けられているデザイン時アセンブリを登録します。 アセンブリ フォルダーを使用してコントロールを登録するために、登録プロシージャで必要となるのは、コントロール アセンブリがディスク上に存在し、ツールボックス レジストリのエントリが指定されていることだけです。 この登録プロシージャは、Visual Studio のインストール前後に発生することがあります。
AssemblyFoldersEx は、Silverlight 3 や .NET Framework 4 などの各対象フレームワーク バージョンの下にあるレジストリ キーです。 AssemblyFoldersEx には、フレームワーク固有のアセンブリを格納するフォルダーを指定するキーのセットが含まれています。 たとえば、Silverlight 3 を対象とする場合、AssemblyFoldersEx レジストリ キーは、次のレジストリ パスにあります。
[HKCU または HKLM]\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Silverlight\v3.0\AssemblyFoldersEx
Toolbox サブキーとサポートされるエントリを AssemblyFoldersEx キーの下に作成すると、ツールボックス、[参照の追加] ダイアログ ボックス、および [アイテムの選択] ダイアログ ボックスにコントロールが表示されます。
次の表に、アセンブリ フォルダーを登録するために AssemblyFoldersEx キーおよび Toolbox キーで使用できるレジストリ エントリを示します。
レジストリ エントリ |
レジストリ エントリの種類 |
説明 |
例 |
---|---|---|---|
<assembly> |
キー |
キーの名前 (通常、商標名) |
[TailspinToys Controls] |
<アセンブリ フォルダー> |
既定の文字列値 |
カスタム コントロールのアセンブリの完全インストール パスを指定します。 デザイナーによって、このフォルダーと Design という名前のサブフォルダーでデザイン時アセンブリが検索されます。 |
@="c:\\Program Files\\Reference Assemblies\\TailspinToys Controls\\Bin\\" |
Toolbox |
キー |
ツールボックスに追加するために、<アセンブリ フォルダー> のアセンブリでコントロールを検索する場合には、Toolbox キーを追加します。 このキーを指定しない場合、コントロールが [アイテムの選択] ダイアログ ボックスに表示され、アセンブリが [参照の追加] ダイアログ ボックスに表示されますが、ツールボックスには表示されません。 |
[ツールボックス] |
TabName |
文字列値 |
<アセンブリ フォルダー> のコントロールに対して既定のツールボックス グループを指定します。 そのグループが存在しない場合は、自動的に作成されます。 値を指定しない場合、コントロールはプラットフォームの既定のグループにインストールされます。 この値を使用して、機能ではなく、ブランドを指定します。 WPF カスタム コントロールおよび Silverlight カスタム コントロールの場合、共通カテゴリまたはすべてのコントロール カテゴリを対象としません。 値はローカライズできません。 |
"TabName"="TailspinToys" |
Servicing |
キー |
ツールボックスのキャッシュを強制的に更新するには、Toolbox キー内で新しいキーまたは値を指定します。 この場合、インストールされた各更新の登録値が含まれる Updates サブキーを作成することを推奨します。 キャッシュを更新するのは、すべてのフレームワーク コントロールではなく、Toolbox キーが属する特定のフォルダーで見つかったコントロールに対してだけです。 アセンブリ フォルダーを更新すると、アセンブリ フォルダーのコントロールに対するユーザーのツールボックスのカスタマイズが失われる場合があります。 |
[更新] "Update3"="1" "Update7"="1" |
次のレジストリ スクリプトの例は、.NET Framework 4 を対象とし、参照アセンブリ パスにあります。 [Tailspin Toys] タブの下にあるツールボックスに、ToolboxBrowsableAttribute が true に設定されたコントロールが表示されます。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\TailspinToys]
@="c:\\\\Program Files\\\\Reference Assemblies\\\\TailspinToys Controls\\\\Bin\\\\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\TailspinToys\Toolbox]
"TabName"="Tailspin Toys"
ToolboxBrowsableAttribute および Toolbox レジストリ キー
ToolboxBrowsableAttribute をコントロールのデザイン時メタデータを追加することで、カスタム コントロールをツールボックスに表示するかどうかを指定します。 詳細については、「チュートリアル: ツールボックス アイコンへのメタデータの提供」を参照してください。
新しいアセンブリを参照し、新しいコントロールをツールボックスに追加するには、[アイテムの選択] ダイアログ ボックスを使用します。 次の表に、カスタム コントロールがツールボックスおよび [アイテムの選択] ダイアログ ボックスにいつ表示されるかを決定する、ToolboxBrowsableAttribute と Toolbox レジストリ キーの間の対話方法を示します。
Toolbox レジストリ キー |
Toolbox レジストリ キーなし |
|
ToolboxBrowsable = true |
|
|
ToolboxBrowsable = false |
|
|
デザイン時アセンブリの読み込み
デザイナーでは、カスタムのデザイン時アセンブリを特定の順序で読み込みます。 これにより、デザイナー固有の実装で汎用実装を置き換えることができます。 ControlLibrary.dll という名前のアセンブリに配置されるカスタム コントロールの場合、デザイン時アセンブリが読み込まれる順序を次の一覧に示します。
ControlLibrary.dll (コントロール アセンブリ)
ControlLibrary.Design.<バージョン>.dll
Design\ControlLibrary.Design.<バージョン>.dll
ControlLibrary.[Expression|VisualStudio].Design.<バージョン>.dll
Design\ControlLibrary.[Expression|VisualStudio].Design.<バージョン>.dll
デザイナー固有のアセンブリは、汎用アセンブリに配置される実装を置き換えます。 たとえば、TailspinToysControlLibrary.VisualStudio.Design.dll は、TailspinToysControlLibrary.Design.dll の実装を置き換えることができます。
さらに、デザイン時アセンブリが、そのファイル名に指定されている <バージョン> に従って読み込まれます。 次の規則は、デザイナーで <バージョン> を解釈する方法を示します。
<バージョン> のメジャー バージョン番号がデザイナーのフレームワーク バージョンとは異なる場合、デザイン アセンブリは読み込まれません。
複数のデザイン時アセンブリがデザイナーのフレームワーク バージョンと互換性がある場合、デザイナーでは、デザイナーのフレームワーク バージョンを超えない最も高いバージョンに対してコンパイルされるバージョンを読み込みます。
バージョンが異なる 4 つのデザイン時アセンブリを読み込むフレームワーク バージョンが 4.1.3.0 である場合に、ビルドされるデザイナーの例を示します。
デザイン時アセンブリ名の例 |
デザイナーでの読み込み |
---|---|
ControlLibrary.Design.3.0.1.0.dll |
いいえ。 互換性のないバージョンです。 |
ControlLibrary.Design.4.0.1.0.dll |
いいえ。 読み込みますが、上位バージョンを使用できます。 |
ControlLibrary.Design.4.1.1.0.dll |
はい。 デザイナーのバージョンに最も近いです。 |
ControlLibrary.Design.4.3.dll |
いいえ。 デザイナーよりも高いフレームワーク バージョンに対してビルドされます。 |
ツールボックスの更新
AssemblyFoldersEx キーによって指定されているフォルダー内のアセンブリを更新するときには、Visual Studio ツールボックスのキャッシュの更新が必要になる場合があります。 キャッシュには、ツールボックスに表示されるコントロールの名前、カテゴリ、およびアイコンが含まれています。 キャッシュには、コントロール アセンブリまたはデザイン時アセンブリは含まれていません。プロジェクトをコンパイルすると、サービスの提供を受けているコントロール アセンブリまたはデザイン時アセンブリが自動的に更新されます。
AssemblyFoldersEx キーが何らかの方法で変更され場合 (値やサブキーの変更)、アセンブリ フォルダーのツールボックスのキャッシュが更新されます。 ツールボックス作業ウィンドウを初めて表示すると、ツールボックスの初期化で更新が発生します (通常は、Visual Studio のブートまたはプロジェクトの読み込みで発生します)。
ツールボックスのキャッシュを強制的に更新するには、Toolbox キー内で新しいキーまたは値を指定します。 この場合、インストールされた各更新の登録値が含まれる Servicing サブキーを作成することを推奨します。 キャッシュを更新するのは、すべてのフレームワーク コントロールではなく、Toolbox キーが属する特定のフォルダーで見つかったコントロールに対してだけです。 アセンブリ フォルダーを更新すると、アセンブリ フォルダーのコントロールに対するユーザーのツールボックスのカスタマイズが失われる場合があります。