1 つのソリューションでプラグインを管理する

カテゴリ: メンテナンス性、デザイン

影響の可能性: 低い

現象

プラグインを含むソリューションをインポートすると、次のようなエラーが表示されます。

ImportSolutionException: Plugin Assemblies import: FAILURE. Error: Plugin: Custom.Xrm.Plugins,
Version=1.2.0.0, Culture=neutral, PublicKeyToken=59f189e458044167 of PluginTypeName: 
Microsoft.Crm.Entities.PluginType and PluginTypeNode: caused an exception.: Plugin Types 
import: FAILURE. Error: Plugin: Custom.Xrm.Plugins, Version=1.2.0.0, Culture=neutral, 
PublicKeyToken=59f189e458044167 of PluginTypeName: Microsoft.Crm.Entities.PluginType caused an 
exception.: PluginType [Custom.Xrm.Plugins.CreateContact] not found in PluginAssembly

ソリューションが含む既存のアセンブリに新しいプラグイン タイプが追加され、そのアセンブリも別のソリューションに含まれている場合、このエラーが発生します。

ガイダンス

プラグイン アセンブリの定義は 1 つのソリューション内で維持する必要があります。 プラグインを管理できる、プラグイン定義のみを含む別のソリューションが必要になる場合があります。

問題となるパターン

このエラーが発生する可能性がある状態の例を以下に 2 つ示します。 どちらの例にも、BasicPlugin.dll ファイルを表すプラグイン アセンブリが存在します。 どちらの例もこのエラーで失敗します: PluginType [BasicPlugin.CreateAccount] not found in PluginAssembly

例 1: 既存のソリューションをアップグレードする

BasicPlugin.dll を含むソリューションが 2 つあります。

対象の (管理された) 環境では、BasicPlugin.dll アセンブリに次のソリューション レイヤーが存在します。

レイヤー ソリューション ソリューションのバージョン BasicPlugin タイプ
6 AnotherSolution v1.0.0.0 UpdateLead
2 PluginSolution v1.0.0.0 UpdateLead

次に PluginSolution を更新してバージョンを v2.0.0.0 に変更し、新しいプラグイン タイプ CreateAccount を含めます。

トップ レベル (レイヤー 1) ソリューション コンポーネント プラグイン アセンブリが新しい CreateAccount プラグイン タイプを含まないため、これは失敗します。

例 2: 新しいソリューションをインストールする

対象の (管理された) 環境では、BasicPlugin.dll アセンブリに次のソリューション レイヤーが存在します。

レイヤー ソリューション ソリューションのバージョン BasicPlugin タイプ
6 PluginSolution v1.0.0.0 UpdateLead
CreateAccount

新しいソリューションをインストールする場合は AnotherSolution v1.0.0.0 で、これはプラグイン タイプ UpdateLead のみを含む BasicPlugin アセンブリを含みます

この新しいソリューションの BasicPlugin.dll は CreateAccount PluginType を含まないため、エラーが発生します。

解決策

適切なソリューションは、複数のソリューションが同じプラグイン アセンブリを含む状況を回避することです。

上記の両方の例では、プラグイン アセンブリが 2 つの異なるソリューションの一部である場合、両方のソリューションで一貫したプラグイン タイプを維持する必要があります。 両方のソリューションで両方のプラグイン アセンブリを引き続き維持する場合は、アセンブリに新しいプラグイン タイプを追加する際に、両方のソリューションを毎回更新する必要があります。

追加情報

ソリューションにはプラグインを含められます。プラグインは相互に関連付けられた PluginAssemblyPluginType のレコードで構成されます。

PluginAssembly はアセンブリのバイナリ コンテンツを含みます。 PluginType は、IPlugin インターフェイスを実装するアセンブリが含むクラスへの参照を含みます。

ソリューション コンポーネントとして、プラグインはソリューション階層化システムの一部です。 互いの上にインストールされた 2 つのソリューションが同じアセンブリを含む場合、アセンブリが含む型が一致しない場合に型の検証が失敗します。

関連情報

ソリューションの階層