サイド バイ サイド アセンブリの DLL の作成
独自のサイド バイ サイド アセンブリを作成する場合は、「サイド バイ サイド アセンブリ を作成するためのガイドライン 」に従い、次のガイドラインに従ってアセンブリで使用される DLL を作成します。
DLL は、複数のバージョンを同時に実行し、相互に干渉することなく同じプロセスで実行できるように設計する必要があります。 たとえば、多くのアプリケーションでは複数のプラグインがホストされ、それぞれが 1 つのコンポーネントの異なるバージョンを必要とします。 サイド バイ サイド アセンブリの開発者は、同じプロセスで同時に実行するときに、コンポーネントの複数のバージョンが正しく動作するように設計およびテストする必要があります。
Windows XP より前のシステムでコンポーネントを共有コンポーネントとして提供する予定の場合は、引き続きコンポーネントを単一インスタンスの共有コンポーネントとしてこれらのシステムにインストールする必要があります。 この場合は、コンポーネントに下位互換性を確保する必要があります。
アセンブリの複数のバージョンがシステム上で実行されている場合に、オブジェクトの使用を評価します。 異なるバージョンのアセンブリで、メモリ マップファイル、名前付きパイプ、登録済みの Windows メッセージとクラス、共有メモリ、セマフォ、ミューテックス、ハードウェア ドライバーなどの個別のデータ構造が必要かどうかを判断します。 アセンブリ バージョン間で使用されるすべてのデータ構造は、下位互換性が必要です。 バージョン間で使用できるデータ構造と、バージョンに対してプライベートにする必要があるデータ構造を決定します。 セマフォやミューテックスなど、共有データ構造に個別の同期オブジェクトが必要かどうかを判断します。
ウィンドウ クラスや Atoms などの一部のオブジェクトは、プロセスごとに一意に名前が付けられます。 ウィンドウ クラスなどのオブジェクトは、マニフェストを使用してアセンブリごとにバージョン管理する必要があります。 Atoms などのオブジェクトの場合は、バージョン間で共有する予定がない限り、バージョン固有の識別子を使用します。 バージョン固有の識別子を使用する場合は、4 部構成のバージョン管理番号を使用します。
任意の DLL に自己登録コードを含めない。 サイド バイ サイド アセンブリ内の DLL を自己登録することはできません。
#define ステートメントを使用して、DLL 内のすべてのバージョン固有の名前を定義します。 これにより、すべてのレジストリ キーを 1 つの場所から変更できます。 アセンブリの新しいバージョンをリリースする場合は、この#defineステートメントのみを変更する必要があります。 次に例を示します。
#define MyRegistryKey "MyAssembly1.0.0.0"
永続していないデータを Temp ディレクトリに格納します。
ユーザー データをグローバルな場所に配置しないでください。 アプリケーション データをユーザー データとは別に保持します。
すべての共有ファイルに、アプリケーションの名前に依存するファイル バージョンを割り当てます。
プロセス間で使用されるすべてのメッセージとデータ構造をバージョンに割り当てて、意図しないプロセス間共有を防ぎます。
DLL は、異なるバージョンのアセンブリ間で共有されていない共有メモリ セクションなど、存在しない可能性があるバージョン間での共有に依存しないようにする必要があります。
元の DLL のバイナリ インターフェイス互換性コントラクトに従わない新しい機能を追加する場合は、新しい CLSID、ProgId、およびファイル名を割り当てる必要があります。 この CLSID、ProgId、およびファイル名を使用するには、今後のバージョンのサイド バイ サイド アセンブリが必要になります。 これにより、サイド バイ サイドではない DLL のバージョンがサイド バイ サイド バージョンに登録されている場合に競合が回避されます。
同じ CLSID または ProgId を再利用する場合は、 をテストして、アセンブリに下位互換性があることを確認します。
アセンブリ コードでアセンブリの既定の設定を初期化して設定します。 レジストリに既定の設定を保存しないでください。
すべてのデータ構造にバージョンを割り当てます。
「サイド バイ サイド アセンブリのステート ストレージを作成する」で説明されているように、DLL には サイド バイ サイド アセンブリの状態を格納する必要があります。