1 Aug’16

Dynamics CRMHow to register Plugin Dynamically?

Problem Definition

How to register the steps of the plugin Dynamically (programmatically).

Introduction

Generally, after the plugin development, users register the plugin and steps using plugin registration tool provided by the CRM SDK.

But, in certain cases it is possible that the user may need to register the step in the plugin dynamically.

For example: Whenever a new entity is added it should have an auto number step registered automatically for that entity.

Description

Here I have created a sample plugin with no logic. I will register this plugin programmatically using console app.

To register the plugin programmatically. We need the following steps to be executed.

  1. Connect to CRM
  2. Create a record of type “pluginassembly”
  3. Create a record of type “plugintype”
  4. Create a record of type “sdkmessageprocessingstep”

Connect to CRM

Since we are registering the plugin using console application we need to connect the CRM instance before processing the steps. Organization service is required to create a record in CRM.

Please make sure you add the below references to the code.

using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Tooling.Connector;
using System;
using System.IO;
using System.Reflection;

You can refer the below code the connect with CRM

public void ConnectCRM()
        {
            string connectionString = "Url=https://XXXX.crm.dynamics.com; Username=XXXX.onmicrosoft.com; Password=**********; authtype=Office365";

       // Connect to the CRM web service using a connection string.
            CrmServiceClient conn = new CrmServiceClient(connectionString);

       // Cast the proxy client to the IOrganizationService interface.
            _orgService = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy;

       // Obtain information about the logged on user from the web service.
            Guid userid = ((WhoAmIResponse)_orgService.Execute(new WhoAmIRequest())).UserId;
        }

Create a record of type “pluginassembly”

Once the connection is successful, we need to register the Plugin Assembly. Here, we need to provide the physical path of the .dll that we need to register.

While creating a record we need to provide the required field value which are listed below.

You can find list of attributes required, by looking into the excel sheet provided by Microsoft. You can find this excel sheet in the SDK with the name “EntityMetadata”

Attributes required:

Code:

        public Guid RegisterAssembly()
        {
            string filePath = @"D:\Plugin_Dynamically\Sample.Plugin.Dynamically\Sample.Plugin.Dynamically\bin\Debug\Sample.Plugin.Dynamically.dll";
            Guid assemblyId = Guid.Empty;
            try
            {
                var assembly = Assembly.LoadFile(filePath);

                string[] props = assembly.GetName().FullName.Split(",=".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

                Entity assemb = new Entity("pluginassembly");
                assemb["name"] = props[0];
                assemb["culture"] = props[4];
                assemb["version"] = props[2];
                assemb["publickeytoken"] = props[6];
                assemb["sourcetype"] = new OptionSetValue(0); // 0= database;
                assemb["isolationmode"] = new OptionSetValue(2); // 1= none, 2=sandbox
                assemb["content"] = Convert.ToBase64String(File.ReadAllBytes(filePath));
                assemblyId = _orgService.Create(assemb);
            }
            catch (Exception)
            {
                throw;
            }
            return assemblyId;
        }

Once the Assembly is registered you will able to see the below steps in plugin

Creating the plugintype record

A plugintype record must be created for each plugin inside the assembly. This can be done dynamically using reflection.

We need to specify the below required field

You can refer the below code for the registration of Plugin Type. The assemblyId is the Guid created on the earlier step.

public Guid CreatePluginType(Guid assemblyId)
        {
            Guid pluginTypeId = Guid.Empty;

            Entity pluginType = new Entity("plugintype");
            pluginType["pluginassemblyid"] = new EntityReference("pluginassembly", assemblyId);
            pluginType["typename"] = "Sample.Plugin.Dynamically.Dynamic";
            pluginType["friendlyname"] = "Sample Plugin Dynamically";
            pluginType["name"] = "Register Plugin";
            pluginType["description"] = " Sample Plugin Dynamically";
            pluginTypeId = _orgService.Create(pluginType);
            return pluginTypeId;
        }

This is how it will look like

Creating the sdkmessageprocessingstep record

At the end we need to create the step to process the request. For example, if you want to register the plugin for the create of the account entity.

You need to have two id retrieved from CRM separately.

Sdkmessageid: you will get this in from the sdkmessage entity you need to provide name as shown below.

Sdkmessagefilterid: You will find this id using Query shown in the below screen shot

You can refer the below code to perform the operation

public void SdkMessageStep(Guid pluginTypeId)
        {
            Guid messageId = new Guid("9EBDBB1B-EA3E-DB11-86A7-000A3A5473E8");

            Guid messageFitlerId = new Guid("C2C5BB1B-EA3E-DB11-86A7-000A3A5473E8");
           
            Entity step = new Entity("sdkmessageprocessingstep");
            step["name"] = "Sdk Message";
            step["configuration"] = "Create account record";

            step["invocationsource"] = new OptionSetValue(0);
            step["sdkmessageid"] = new EntityReference("sdkmessage", messageId);

            step["supporteddeployment"] = new OptionSetValue(0);
            step["plugintypeid"] = new EntityReference("plugintype", pluginTypeId);
            
            step["mode"] = new OptionSetValue(0);
            step["rank"] = 1;
            step["stage"] = new OptionSetValue(20);

            step["sdkmessagefilterid"] = new EntityReference("sdkmessagefilter", messageFitlerId);
            Guid stepId = _orgService.Create(step);
        }

Once the above step is executed successfully you will see the plugin as shown below

Conclusion

Even though we have plugin registration tool available to register the plugin using plugin registration tool we can also register the plugin programmatically in certain scenario.

 

Written by

Team Member

CloudFronts

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.

Want to streamline your business processes?

  • This field is for validation purposes and should be left unchanged.

Recent Articles

  • Reading more then 10K records in D3FOE OData API

    11 July’ 2018

    Introduction: We all know Dynamics 365 Finance and Operations has limitation of 10K records to be fetched at a time usi...

    Read more
  • Paging in D365 Customer Engagement v9.0

    10 July’ 2018

    Introduction: The Xrm.retrieveMultipleRecords method is used to retrieve a collection of records in Dynamics 365 Custom...

    Read more
  • Set up Dynamics 365 connection in Microsoft Social Engagement

    10 July’ 2018

    Introduction: This blog explains how to Set up Dynamics 365 connection in Microsoft Social Engagement. Steps to be follo...

    Read more
  • Voice of the Customer failed to install

    10 July’ 2018

    Introduction: Many people face issues in installing Voice of Customer solution on v9 environment and trying repeatedly ...

    Read more
  • Scribe Insight AX as a Web Service Find Block issue

    10 July’ 2018

    Introduction: If we need to look up for any value from AX then we do it by using a Find Block in Scribe Insight Eg: Basi...

    Read more