Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extension Methods for CRM 2011 Online Instances Causing TypeLoad Exceptions

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?

like image 465
glosrob Avatar asked May 04 '13 06:05

glosrob


1 Answers

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
like image 186
Guido Preite Avatar answered Oct 05 '22 00:10

Guido Preite