WPF のユーザーコントロールを含むライブラリの組み込み
概要
Next Design では、Next Design 本体が参照するライブラリより新しいバージョンのライブラリをエクステンションで利用できるようにするため、エクステンション単位で異なる領域にライブラリをロードします。
しかしながら、ライブラリによっては異なる領域にロードされることによって動作に影響を及ぼす可能性があります。
例えば、WPF(Windows Presentation Foundation)で提供される画面描画を伴うユーザーコントロールをライブラリで利用しており、そのライブラリがエクステンション単位で異なる領域にロードされた場合に、次のような問題現象が発生することが確認されています。
- 複数のエクステンションで共通に利用するコントロールをそれぞれのエクステンションで交互に表示すると、2回目以降の表示に失敗します。
このような問題を回避するため、ライブラリを Next Design 本体と同じ領域(これをデフォルトの領域と呼びます)にロードして共有できる機構を提供しています。
共有ライブラリの指定
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" // 複数のワイルドカードも対象にできます。
}
]
}
}
注意事項
エクステンションで参照しているアセンブリを共有ライブラリに指定しなかった場合は非共有ライブラリとしてロードされます。アセンブリを共有ライブラリに指定した場合はそのアセンブリに加えて、そのアセンブリが参照するアセンブリもすべて共有ライブラリとしてロードされます。
そして、非共有ライブラリと共有ライブラリが同じアセンブリを参照している場合は、同じアセンブリが別々のメモリ管理下に二重にロードされた状態になります。
この状態では、同じアセンブリで定義されている同じ型であっても、他方のメモリ管理下では見つからないといった実行時エラーが発生する可能性があります。
WPF を利用しているエクステンションをはじめ、このようなアセンブリを参照しているエクステンションでは、該当するアセンブリをすべて共有ライブラリに指定してください。
エクステンションで参照しているアセンブリのロードについて、次のページもご参照ください。