メインコンテンツまでスキップ

WPF のユーザーコントロールを含むライブラリの組み込み

プレビュー公開

本機能および本機能で利用する API は先行公開しているものです。 現時点で品質保証しておりませんので、ご利用される場合はユーザー様の責任でご利用ください。 また、これらの仕様は予告なく変更する場合がありますのでご了承ください。

概要

V2.0 では、Next Design 本体が参照するライブラリより新しいバージョンのライブラリをエクステンションで利用できるようにするため、エクステンション単位で異なる領域にライブラリをロードします。
しかしながら、ライブラリによっては異なる領域にロードされることによって動作に影響を及ぼす可能性があります。

例えば、WPF(Windows Presentation Foundation)で提供される画面描画を伴うユーザーコントロールをライブラリで利用しており、そのライブラリがエクステンション単位で異なる領域にロードされた場合に、次のような問題現象が発生することが確認されています。

  • 複数のエクステンションで共通に利用するコントロールをそれぞれのエクステンションで交互に表示すると、2回目以降の表示に失敗します。

このような問題を回避するため、ライブラリを Next Design 本体と同じ領域(これをデフォルトの領域と呼びます)にロードして共有できる機構を提供しています。

備考

本機構を利用する場合は、Next Design V2.0 Service Update 1 以降にバージョンアップしてください。

共有ライブラリの指定

WPFライブラリ等をデフォルトの領域にロードするようにマニフェストで指定できます。デフォルトの領域にロードするように指定したライブラリを共有ライブラリと呼びます。 共有ライブラリを指定するには、マニフェストに次のように記述します。

  • ライブラリのパスの指定は、マニフェストファイルからの相対パスで指定します。
manifest.json
{
"runtime": {
"sharedAssemblies" : [
{
"path" : "NextDesign.CustomUI.DataGrid.dll"
},
{
"path" : "mySubDir/NextDesign.CustomUI.Dialogs.dll"
}
]
}
}
  • パスはワイルドカード("*")を指定できます。ただし、ワイルドカードは同一フォルダ内でのみ有効です。
manifest.json
{
"runtime": {
"sharedAssemblies" : [
{
"path" : "NextDesign.CustomUI.*.dll"
},
{
"path" : "SomeUILib.*.dll"
},
{
"path" : "NextDesign.*.SomeLib.*.dll" // 複数のワイルドカードも対象にできます。
}
]
}
}

共有ライブラリのロード

Next Designは、有効なすべてのエクステンション1のマニフェストをライフサイクルに関係なく走査して、共有ライブラリとして指定されているライブラリを決定します。この時、それぞれのエクステンションに同じライブラリの異なるバージョンが共有ライブラリとして指定されている場合は、それらのライブラリのうちで最も新しいファイルバージョンのライブラリがロード対象となります。
この仕組みにより、古いバージョンのライブラリが配置されているエクステンションであっても、他のエクステンションフォルダに配置された最新のライブラリを利用することになります。

また、カルチャ(リソース)については、Next Design 本体のカルチャに対してリソースライブラリをロードします2。この際、共有ライブラリとしてロード対象となったライブラリと同じフォルダのjaenなどのサブフォルダを探索します。

共有ライブラリの探索パスについて
  • エクステンションの共有ライブラリは、エクステンションの実行フォルダ以下のフォルダから探索します。
    ただし、次の条件に該当するフォルダ(およびそのサブフォルダ)は探索対象から除外します。
    • フォルダ名が"."から始まるフォルダ
    • フォルダ内に実行ファイル(*.exe)が含まれるフォルダ

注意事項

同じライブラリを共有ライブラリに指定しているエクステンションと、共有ライブラリに指定していないエクステンションが混在する場合、どのエクステンションでも共有ライブラリが使用されます。

  • この際、共有ライブラリに指定したエクステンションのライブラリのうち最もファイルバージョンが新しいライブラリがロード対象となります。
  • そのため、共有ライブラリに指定していないエクステンションで新しいバージョンのライブラリを配置していても、該当ライブラリはロードされません。
共有ライブラリのバージョンの解決について

このメカニズムは、古いバージョンのライブラリが配置されたエクステンションに対しても、バグフィックスや最新機能が利用できます。
一方で、該当ライブラリで下位互換性が保証されていない場合には、古いバージョンのライブラリで構成されたエクステンションで実行時エラーが発生することがあります。

リフレクションで動的にアセンブリをロードする機能を共有ライブラリに指定した場合、動的にロードしたアセンブリやそのアセンブリが参照するアセンブリもすべて共有ライブラリになります。

  • エクステンションで参照していて共有ライブラリに指定していないアセンブリは非共有ライブラリになりますが、同じアセンブリを共有ライブラリから動的にロードすると、共有ライブラリにもロードされます。
  • このとき、そのアセンブリで定義されている型が見つからないといった実行時エラーが発生する可能性があります。

このようなアセンブリがある場合、すべて共有ライブラリに指定してください。

制約事項

  • ネイティブライブラリを共有ライブラリに指定することはできません。共有ライブラリには、ネイティブライブラリが含まれないように構成してください。
  • Next Design本体が参照するライブラリは共有ライブラリに指定できません。Next Design本体が参照するライブラリを共有ライブラリに指定しないようにマニフェストを定義してください。

アセンブリ参照時の指定と保守時の注意点

共有の要否とNextDesign同梱の有無によって、以下のように参照可能なバージョンが制限されます。
また、他エクステンションとの整合などの注意点もまとめます。

他エクステンションと共有するかNextDesignに同梱されているか共有ライブラリの指定要否参照可能なバージョン開発時の注意点保守時の注意点
共有する同梱されているしないNextDesignと同じバージョンなし※1
同梱されていないする任意のバージョン※2※3
共有しない同梱されているしないNextDesignと同じか新しいバージョン※4※5
同梱されていないしない任意のバージョン※4※5

※1) NextDesignがバージョンアップされて、アセンブリのバージョンが変更されたとき、その新しいバージョンでも正しく動作することを確認してください。
※2) 他エクステンションでも共有ライブラリに指定されていた場合、新しいほうのバージョンで正しく動作することを確認してください。
※3) NextDesignがバージョンアップされて、アセンブリがNextDesignに同梱されるようになったとき、そのバージョンで正しく動作することを確認してください。他エクステンションでも共有ライブラリに指定されていた場合、そのエクステンションの参照バージョンが変更されたときに正しく動作することを確認してください。
※4) 他エクステンションで共有ライブラリに指定されていた場合、そのバージョンで正しく動作することを確認するか、共有ライブラリに指定してください。
※5) NextDesignがバージョンアップされて、アセンブリのバージョンが変更されたときや他エクステンションの参照バージョンが変更されたとき、その新しいバージョンでも正しく動作することを確認してください。 他エクステンションで共有ライブラリに指定されていた場合、そのエクステンションの参照バージョンが変更されたときに正しく動作することを確認してください。

Footnotes

  1. Next Design本体の拡張機能の管理で無効化されていないエクステンション。

  2. リソースライブラリはマニフェストで共有ライブラリとしての指定は不要です。