Question

I am writing a plugin for a client on a CRM Online trial tenant (so assume it has latest patches etc.) and have come across an error I’ve not seen before. Generally speaking I always use an extension method along the lines of the following, just for clarity of code really:

public static void AddOrUpdate(this Entity e, string propertyName, object value)
{
    if (e.Attributes.Contains(propertyName))
    {
        e.Attributes[propertyName] = value;
    }
    else
    {
        e.Attributes.Add(propertyName, value);
    }
}

Nothing hugely controversial there I think? Anyway for whatever reason if I include the class file as part of a plugin for this client, I get the following error thrown:

Unhandled Exception: System.ServiceModel.FaultException`1
System.TypeLoadException: Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #9A0442A7

[foo.bar.Plugins: foo.bar.Plugins.TrackActivity]
[6ed535ec-c7a8-e211-858f-3c4a92dbdc37: foo.bar.Plugins.TrackActivity: Create of task]

There is no trace included, which shows the plugin isn’t even executed (even if the first line of code is throwing an exception!).

I did a bit of digging and it seems that for this client/instance at least: - If I include a static class file (public static class Foo) with any method, I get this error, whether the class is actually used by code or not - When the error is generated, the plugin itself is not executed (the exception occurs before any code)

Anyone seen anything like this before or have any insight into System.TypeLoadException exceptions?

Was it helpful?

Solution

I just tried this plugin with a CRM Online trial instance (5.0.9690.3358) and is working.

The plugin is registered on Create message, Task entity, Pre-operation, Synchronous.

using System;
using Microsoft.Xrm.Sdk;

namespace TestPlugin
{
    public class MyPlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                if (entity.LogicalName != "task")
                    return;

                try
                {
                    entity.AddOrUpdate("description", "updated by plugin");  
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
            }
        }
    }

    public static class ExtensionMethods
    {
        public static void AddOrUpdate(this Entity e, string propertyName, object value)
        {
            if (e.Attributes.Contains(propertyName))
            {
                e.Attributes[propertyName] = value;
            }
            else
            {
                e.Attributes.Add(propertyName, value);
            }
        }

    }
}

This to be sure that the problem is not the extension method.

My best guess (in order):

  • One project in your solution is compiled with .NET Framework 4.5
  • You are using old SDK version
  • You are using old Plugin Registration Tool

OTHER TIPS

We had the same problem with CRM 2011 On-premises on the customer's server (2008 R2). Fortunately we did not have to go back to .NET 4.0 - manually installing 4.5 on the server fixed the problem. Hopefully CRM online will be updated soon enough.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top