WPF のユーザーコントロールを含むライブラリの組み込み
本機能および本機能で利用する API は先行公開しているものです。 現時点で品質保証しておりませんので、ご利用される場合はユーザー様の責任でご利用ください。 また、これらの仕様は予告なく変更する場合がありますのでご了承ください。
概要
V2.0 では、Next Design 本体 が参照するライブラリより新しいバージョンのライブラリをエクステンションで利用できるようにするため、エクステンション単位で異なる領域にライブラリをロードします。
しかしながら、ライブラリによっては異なる領域にロードされることによって動作に影響を及ぼす可能性があります。
例えば、WPF(Windows Presentation Foundation)で提供される画面描画を伴うユーザーコントロールをライブラリで利用しており、そのライブラリがエクステンション単位で異なる領域にロードされた場合に、次のような問題現象が発生することが確認されています。
- 複数のエクステンションで共通に利用するコントロールをそれぞれのエクステンションで交互に表示すると、2回目以降の表示に失敗します。
このような問題を回避するため、ライブラリを Next Design 本体と同じ領域(これをデフォルトの領域と呼びます)にロードして共有できる機構を提供しています。
本機構を利用する場合は、Next Design V2.0 Service Update 1 以降にバージョンアップしてください。
共有ライブラリの指定
WPFライブラリ等をデフォルトの領域にロードするようにマニフェストで指定できます。デフォルトの領域にロードするように指定したライブラリを共有ライブラリと呼びます。 共有ライブラリを指定するには、マニフェストに次のように記述します。
- ライブラリのパスの指定は、マニフェストファイルからの相対パスで指定します。
{
"runtime": {
"sharedAssemblies" : [
{
"path" : "NextDesign.CustomUI.DataGrid.dll"
},
{
"path" : "mySubDir/NextDesign.CustomUI.Dialogs.dll"
}
]
}
}
- パスはワイルドカード("*")を指定できます。ただし、ワイルドカードは同一フォルダ内でのみ有効です。
{
"runtime": {
"sharedAssemblies" : [
{
"path" : "NextDesign.CustomUI.*.dll"
},
{
"path" : "SomeUILib.*.dll"
},
{
"path" : "NextDesign.*.SomeLib.*.dll" // 複数のワイルドカードも対象にできます。
}
]
}
}
共有ライブラリのロード
Next Designは、有効なすべてのエクステンション1のマニフェストをライフサイクルに関係なく走査して、共有ライブラリとして指定されているライブラリを決定します。この時、それぞれのエクステンションに同じライブラリの異なるバージョンが共有ライブラリとして指定されている場合は、それらのライブラリのうちで最も新しいファイルバージョンのライブラリがロード対象となります。
この仕組みにより、古いバージョンのライブラリが配置されているエクステンションであっても、他のエクステンションフォルダに配置された最新のライブラリを利用することになります。
また、カルチャ(リソース)については、Next Design 本体のカルチャに対してリソースライブラリをロードします2。この際、共有ライブラリとしてロード対象となったライブラリと同じフォルダのja
、en
などのサブフォルダを探索します。
- エクステンションの共有ライブラリは、エクステンションの実行フォルダ以下のフォルダから探索します。
ただし、次の条件に該当するフォルダ(およびそのサブフォルダ)は探索対象から除外します。- フォルダ名が"."から始まるフォルダ
- フォルダ内に実行ファイル(*.exe)が含まれるフォルダ
注意事項
同じライブラリを共有ライブラリに指定しているエクステンションと、共有ライブラリに指定していないエクステンションが混在する場合、どのエクステンションでも共有ライブラリが使用されます。
- この際、共有ライブラリに指定したエクステンションのライブラリのうち最もファイルバージョンが新しいライブラリがロード対象となります。
- そのため、共有ライブラリに指定していないエクステンションで新しいバージョンのライブラリを配置していても、該当ライブラリはロードされません。
このメカニズムは、古いバージョンのライブラリが配置されたエクステンションに対しても、バグフィックスや最新機能が利用できます。
一方で、該当ライブラリで下位互換性が保証されていない場合には、古いバージョンのライブラリで構成されたエクステンションで実行時エラーが発生することがあります。
リフレクションで動的にアセンブリをロードする機能を共有ライブラリに指定した場合、動的にロードしたアセンブリやそのアセンブリが参照するアセンブリもすべて共有ライブラリになります。
- エクステンションで参照していて共有ライブラリに指定していないアセンブリは非共有ライブラリになりますが、同じアセンブリを共有ライブラリから動的にロードすると、共有ライブラリにもロードされます。
- このとき、そのアセンブリで定義されている型が見つからないといった実行時エラーが発生する可能性があります。
このようなアセンブリがある場合、すべて共有ライブラリに指定してください。