How to Write and Understand a Dynamics CRM Plugin

Here’s a sample plugin code in Dynamics CRM written in C#, along with a detailed explanation of each line. This plugin will update the "Description" field of an entity whenever a record is created.
Sample Plugin Code
using System; // For basic .NET types
using Microsoft.Xrm.Sdk; // Provides key interfaces for CRM plugin development
using Microsoft.Xrm.Sdk.Query; // For performing queries against CRM data
namespace SamplePluginNamespace // Custom namespace for the plugin
{
public class SamplePlugin : IPlugin // Plugin class implementing the IPlugin interface
{
public void Execute(IServiceProvider serviceProvider)
{
// STEP 1: Retrieve the context of the plugin
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.MessageName != "Create" || context.Stage != 40)
return; // Exit if the message is not 'Create' or it is not in the 'PostOperation' stage
// STEP 2: Obtain the organization service
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// STEP 3: Retrieve the target entity from the input parameters
Entity targetEntity = (Entity)context.InputParameters["Target"];
try
{
// STEP 4: Update the 'Description' field with a custom message
targetEntity["description"] = $"Record created on {DateTime.Now}";
// STEP 5: Persist changes back to the database
service.Update(targetEntity);
}
catch (Exception ex)
{
// STEP 6: Handle errors and rethrow as an InvalidPluginExecutionException
throw new InvalidPluginExecutionException($"An error occurred in the SamplePlugin: {ex.Message}", ex);
}
}
}
}
Line-by-Line Explanation
-
using System;
- Imports basic .NET library types such as
DateTime
and exceptions.
- Imports basic .NET library types such as
-
using Microsoft.Xrm.Sdk;
- Imports CRM SDK interfaces for plugins such as
IPlugin
,IPluginExecutionContext
, andIOrganizationService
.
- Imports CRM SDK interfaces for plugins such as
-
using Microsoft.Xrm.Sdk.Query;
- Enables querying CRM entities when interacting with data.
-
namespace SamplePluginNamespace
- Defines a custom namespace to organize the code logically and avoid naming conflicts.
-
public class SamplePlugin : IPlugin
- Implements the
IPlugin
interface, making this class recognized by Dynamics CRM as a plugin.
- Implements the
-
public void Execute(IServiceProvider serviceProvider)
- The main method executed when the plugin is triggered, as required by the
IPlugin
interface.
- The main method executed when the plugin is triggered, as required by the
-
Retrieve plugin execution context:
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
- Retrieves the execution context, which contains all information about the triggered event.
-
Validate event type and stage:
if (context.MessageName != "Create" || context.Stage != 40) return;
- Ensures the plugin executes only for the
Create
message in thePostOperation
stage.
- Ensures the plugin executes only for the
-
Create organization service:
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
- Creates an organization service instance for interacting with CRM data.
-
Retrieve the target entity:
Entity targetEntity = (Entity)context.InputParameters["Target"];
- Extracts the target record being created.
-
Update the
Description
field:targetEntity["description"] = $"Record created on {DateTime.Now}";
- Sets the
Description
field value dynamically based on the current date and time.
- Sets the
-
Persist changes to CRM:
service.Update(targetEntity);
- Updates the record in the database with the new value in the
Description
field.
- Updates the record in the database with the new value in the
-
Handle exceptions:
catch (Exception ex) { throw new InvalidPluginExecutionException($"An error occurred in the SamplePlugin: {ex.Message}", ex); }
- Catches runtime exceptions and throws them as
InvalidPluginExecutionException
for debugging or logging purposes.
- Catches runtime exceptions and throws them as
Usage Details
- Registration: Use the Plugin Registration Tool to register this plugin in CRM for the
Create
message. - Target Entity: Ensure the target entity has a field named
description
. Adjust the field name accordingly if different.
This plugin demonstrates essential patterns like validation, service access, and error handling, ensuring robust development in Dynamics CRM.
Published on:
Learn moreRelated posts
Why Plugin Depth Matters in Dynamics CRM
Plugin development in Dynamics CRM is one of the most advanced and intricate components, requiring deep expertise in the platform's event pipe...
Debunking: Dynamics CRM Destination – How Text Lookup Works
When we want to push data to Dataverse/Dynamics CRM using SSIS – KingswaySoft, usually there are relationships (lookup) that we need to ...
Understanding Activity Party Types in Dynamics 365 CE
Dynamics 365 Customer Engagement features 11 unique activity party types, identified by specific integer values in the ActivityParty.Participa...
Debunking: KingswaySoft Dynamics CRM Source- Output Timezone
Hi! I’m back after so a long hiatus (probably I’ll write the reason for this later 🤣). As [lazy] Developers, we’re most lik...
How to configure donotreply email using Shared mailboxes in Dynamics 365 CE?
This article explains how to create and configure a Shared Mailbox in Microsoft 365 for sending emails to users in Dynamics 365 CE. It details...
Enhancing Knowledge Retrieval with Microsoft Copilot Agents in Dynamics CRM and SharePoint
Studies show that 70% of employees spend unnecessary time searching for information across multiple systems, leading to productivity losses an...
{How to} become MCT Microsoft Certified Trainer on Microsoft Dynamics 365 Customer Engagement step by step instructions
Hello Everyone,Today i am going to share guidelines on becoming Microsoft Certified Trainer on Microsoft Dynamics 365 Customer Engagement or P...
Default Value vs. Current Value in Dynamics 365 CE: Key Differences
In Dynamics 365 CE (Customer Engagement), environment variables are used to manage configuration settings for solutions. When dealing with env...
Dynamics 365 CE Solution Import Failed in Azure DevOps Pipelines
Got the below error while importing Dynamics CRM Solution via Azure DevOps Pipeline. 2024-12-18T23:14:20.4630775Z ]2024-12-18T23:14:20.74...