Programmatically Registering Plugins in Dynamics CRM 4.0

Gayan Perera, 22 November 2010

Programmatically Registering Plugins in Dynamics CRM 4.0The plugin registration tool is great when you want to quickly register, change and test plugins, but if you have an automatic build/testing environment you need some way of creating a new CRM organisation, importing customizations, register custom plugins/workflows and run your tests.

Below you’ll find some handy snippets of code that you can use to register plugins programmatically.


Request & Response

string assemblyPath = @".\blah.dll";
RegisterSolutionRequest request = new RegisterSolutionRequest
    PluginAssembly = GetPluginAssembly(assemblyPath),
    Steps = GetSteps()

response = sdk.Execute(request) as RegisterSolutionResponse;
Guid solutionId = response.PluginAssemblyId;

solutionId is useful when you want to unregister the solution.

GetPluginAssembly Method

It’s recommended that you store the plugin it the database, one of the main reasons is if you have multiple front-ends you don’t have to copy the plugin to disk or GAC, CRM will automatically load and execute.

The plugin content is stored as base64 therefor we have to read all the bytes from the dll and convert to base64.

Assembly assembly = Assembly.LoadFile(assemblyPath);
string[] prop = assembly.GetName().FullName.Split(",= ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
pluginassembly asm = new pluginassembly
    name = prop[0],
    culture = prop[4],
    version = prop[2],
    publickeytoken = prop[6],
    sourcetype = new Picklist(AssemblySourceType.Database),
    content = Convert.ToBase64String(File.ReadAllBytes(assemblyPath))

**Programmatically Registering Plugins in Dynamics CRM 4.0

GetSteps Method

The sample code below shows how you can create a single step, to register multiple steps, create an array, store each step inside the array and assign to the Steps property of the RegisterSolutionRequest.

var step1 = new SdkMessageProcessingStepRegistration
    CustomConfiguration = "",
    Description = "Example Post Create",
    FilteringAttributes = ""// all attributes
    Mode = 1, // async
    MessageName = "Create",
    PrimaryEntityName = "mag_example",
    Stage = 50, // post
    SupportedDeployment = 0,
    PluginTypeName = "Xyz.Abc.ExamplePlugin",
    PluginTypeFriendlyName = "Abc - Example",
    InvocationSource = 0 // parent pipe

PluginTypeName is the namespace.classname of the plugin, PluginTypeFriendlyName is what’s displayed in the plugin registration tool, if you have multiple steps on the sample class make sure to keep the PluginTypeFriendlyName the same so it’s grouped nicely in the registration tool.

* Image 1 from:
** Image 2 from: