Manage plug-ins in a single solution
Category: Maintainability, Design
Impact potential: Low
Symptoms
When importing a solution that contains a plug-in, you may see an error like this:
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
This error occurs when a new Plug-in Type is added to an existing assembly in the solution and that assembly is also included in a different solution.
Guidance
The definition of a plug-in assembly should be maintained within a single solution. You may want to have a separate solution that contains only plug-in definitions to help manage the plug-ins.
Problematic patterns
Below are two examples of the condition where this error may occur. In both examples, there is a Plug-in Assembly representing the BasicPlugin.dll file. Both examples will fail with error: PluginType [BasicPlugin.CreateAccount] not found in PluginAssembly
.
Example 1: Upgrade an existing solution
There are two solutions that include BasicPlugin.dll.
In the target (managed) environment, the BasicPlugin.dll assembly has the following solution layering.
Layer | Solution | Solution Version | BasicPlugin Types |
---|---|---|---|
1 | AnotherSolution | v1.0.0.0 | UpdateLead |
2 | PluginSolution | v1.0.0.0 | UpdateLead |
Then, you update the PluginSolution, changing the version to v2.0.0.0, and include a new Plugin Type: CreateAccount
.
This will fail because the top-level (layer 1) solution component plug-in assembly doesn't contain the new CreateAccount
Plugin Type.
Example 2: Install a new solution
In the target (managed) environment, the BasicPlugin.dll assembly has the following solution layering.
Layer | Solution | Solution Version | BasicPlugin Types |
---|---|---|---|
1 | PluginSolution | v1.0.0.0 | UpdateLead CreateAccount |
When you try to install a new solution, AnotherSolution v1.0.0.0, which has a BasicPlugin assembly that contains only plug-in type: UpdateLead
The error occurs because the BasicPlugin.dll in this new solution doesn't contain the CreateAccount
PluginType.
Remedies
The correct solution is to avoid the situation where the same plug-in assembly is included in multiple solutions.
In both examples above, when the Plug-in Assembly is part of two different solutions, you must maintain consistent Plug-in Types in both solutions. If you continue to maintain both Plug-in assemblies in both solutions, you will need to update both solutions each time you add a new Plugin Type to the assembly.
Additional information
Solutions can contain Plug-ins. Plug-ins consist of PluginAssembly and PluginType records that are associated with each other.
PluginAssembly contains the binary contents of the assembly. PluginType contains a reference to the class in the assembly that implements the IPlugin interface.
As solution components, plug-ins participate in the solution layering system. If the same assembly is included in two solutions installed on top of each other, the type validations will fail if there are mismatched types within the assemblies.