アダプターの完全なインストール プロセスは、次の手順で構成されます。
依存関係を確認します。 たとえば、MSMQ アダプター インストーラーは、アダプター ランタイムがローカル MSMQ サービスに依存しているため、ローカル MSMQ サービスの存在を確認します。
ローカル ファイル システムを設定します。 これには、インストール フォルダーの作成、バイナリ ファイルとサポート ファイルのコピーが含まれます。 フォルダーへのアクセスとファイル アクセス許可が正しく構成されていることを確認します。
マネージド アセンブリをシステム グローバル アセンブリ キャッシュにインストールします。
アダプターのレジストリ キーを作成します。
注
32 ビット アダプターの場合、BizTalk Server 管理コンソールは、レジストリ内の HKEY_CLASSES_ROOT ブランチを使用してカスタム アダプター構成を取得します。 32 ビット アダプターが 64 ビット サーバーにインストールされている場合、代わりに BizTalk Serve 管理コンソールはアダプター構成データに HKEY_CLASSES_ROOT\Wow6432Node\ ブランチを使用します。
アダプターを BizTalk Server に追加します。 これは、アダプターのための BizTalk 管理データベース内の新しいエントリだけでなく、アダプターが昇格するプロパティを反映するために使用されるプロパティ スキーマのエントリも含まれることを意味します。 この手順は、BizTalk Server 管理コンソールを使用して手動で行う場合があります。
例外
アダプター インストーラーは、BizTalk Server の部分的なインストールで依存関係を確認する必要がない場合があります。 たとえば、管理ツールのみのインストールでは、アダプター ランタイムが使用されていないため、アダプター インストーラーはアダプター ランタイムの依存関係を確認する必要はありません。 BizTalk Server ランタイムのみのインストールでも同じことが当てはまります。この場合、アダプター インストーラーはアダプターのデザイン時の依存関係を確認する必要はありません。
複数の BizTalk Server 環境では、前の一覧の最後の手順 (アダプターを BizTalk Server に追加) は、最初の BizTalk Server でのアダプターのインストールでのみ行われます。 これは、すべての BizTalk Server サービス インスタンスが同じ BizTalk 管理データベースを共有するためです (既定の名前は BizTalkMgmtDB)。 アダプターが同じグループ内の他の BizTalk サーバーに追加された場合、追加の手順は失敗します。
アダプター アセンブリをグローバル アセンブリ キャッシュにインストールする
アダプターのインストール パスが異なる複数の BizTalk Server ホスト環境をサポートするには、アダプター アセンブリをシステム グローバル アセンブリ キャッシュにインストールする必要があります。
アダプターのインストールと構成中に、BizTalk 管理データベースのadm_adapter テーブルに新しいアダプター エントリが作成されます (既定の名前は BizTalkMgmtDB)。 このエントリには、実行時とデザイン時の両方で BizTalk Server によって使用されるすべての参照情報が含まれます。
InBoundAssemblyPath フィールドと OutboundAssemblyPath フィールドは、アダプター バイナリを読み込む場所を確認するために BizTalk Server ランタイムによって使用されます。 BizTalk Server グループ用の BizTalk 管理データベースは 1 つしかないため、グループ内のすべての BizTalk サーバーがこの同じ情報を共有する必要があります。 グループ内の異なる BizTalk サーバーにアダプターをインストールする場合は、各サーバーで同じインストール パスを使用する必要があります。 ローカル インストール パスが BizTalk 管理データベースに格納されているパスと異なる場合、BizTalk Server はアダプター バイナリを読み込めません。
必ず厳密な名前でアダプターのアセンブリに署名し、Gacutil.exe を使用して、アダプターのインストール中にアダプター アセンブリをシステム グローバル アセンブリ キャッシュに配置します。 InBoundAssemblyPath フィールドと OutboundAssemblyPath フィールドを null のままにするか、空のままにしてください。
アダプター構成にフレームワークを使用する
BizTalk Server には、アダプター構成ユーザー インターフェイス (UI) のプロパティ シートを生成するためのメカニズムが用意されています。 構成プロパティの XML スキーマ定義 (XSD) 定義に基づいています。 このフレームワークを使用すると、アダプター開発者にとって大きな課題が発生します。 このセクションでは、これらの問題の一部に対する効果的な回避策を示します。
すべてのキー プロパティのカスタム プロパティ エディターを検討する
プロパティ シートのプロパティの上に重要なプロパティ検証を配置することはできません。 フレームワークは、XML スキーマ定義 (XSD) の simpleType 制限を使用して、UI の検証規則を定義しようとします。 最大値と最小値の単純な規則が適用されますが、文字列フィールドの正規表現の制限はサポートされていません。 また、制限が適用される前に、データが共通言語ランタイム (CLR) 型に変換されます。 つまり、UI のユーザーは、範囲外のエラーではなく、不可解な型変換エラーを受け取ることがあります。 全体として、検証ロジックは非常に弱いです。
多くのアダプター開発者が採用しているソリューションは、プロパティ シートのメイン プロパティのカスタム プロパティ エディターを記述することです。 (多くの場合と同様に) 複数の相互依存プロパティがある場合、カスタム プロパティ エディターは結果を 1 つのフィールドに結合でき、ランタイムは後でそれらを分離できます。 これは、必要な(一般的には簡単ですが)カスタムコードをインターフェイスに取り込む唯一の方法です。
カスタム プロパティ エディターは比較的簡単に記述でき、XSD 内のプロパティに注釈を付けて使用できます。 注釈は、プロパティ エディターのエントリ ポイントを公開するアセンブリを参照し、CLR フォームを表示するようにコード化されています。 通常のユーザー インターフェイスを記述し、Visual Studio が提供する従来のインターフェイス生成ツールを使用できるようになりました。
次のコードは、XSD を使用してカスタム プロパティ エディターを追加する方法を示しています。
<xs:element name="queueDetails" type="xs:string" minOccurs="0">
<xs:annotation>
<xs:appinfo>
<baf:designer>
<baf:displayname _locID="queueName">Queue Definition</baf:displayname>
<baf:description _locID="receiveQueueDesc">Details of MQSeries Server, Queue Manager and Queue from where you want to receive messages.</baf:description>
<baf:category _locID="mqsCategory">MQSeries</baf:category>
<baf:editor assembly="Microsoft.BizTalk Server.Adapter.MQSAdmin.dll">Microsoft.BizTalk Server.Adapter.MQSAdmin.MQSUITypeEditor</baf:editor>
</baf:designer>
</xs:appinfo>
</xs:annotation>
</xs:element>
参照されるコードは次のようになります。
public class MQSUITypeEditor : System.Drawing.Design.UITypeEditor
{
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle
(System.ComponentModel.ITypeDescriptorContext context)
{
return System.Drawing.Design.UITypeEditorEditStyle.Modal;
}
public override object EditValue (System.ComponentModel.ITypeDescriptorContext context,
System.IServiceProvider provider, object value)
{
Form qdForm = new QueueDefinitionForm(value);
IWindowsFormsEditorService service =
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
DialogResult dialogResult = service.ShowDialog(qdForm);
//…
}
}
class QueueDefinitionForm : System.Windows.Forms.Form
{
// traditional UI code goes here!
}
管理ランタイムは XSD で参照されているアセンブリを検索できる必要があるため、グローバル アセンブリ キャッシュに追加する必要があります。