2013-05-04 11 views
5

Sto scrivendo un plug-in per un client su un tenant di prova di CRM Online (quindi supponiamo che abbia le patch più recenti ecc.) E abbia riscontrato un errore che non ho visto prima. In generale ho sempre usare un metodo di estensione lungo le linee di seguito, solo per chiarezza di codice davvero:Metodi di estensione per le istanze online di CRM 2011 che causano il tipo di eccezioni di caricamento

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); 
    } 
} 

Niente estremamente controverso ci credo? In ogni caso per qualsiasi motivo, se comprendo il file di classe come parte di un plugin per questo client, ottengo il seguente errore gettato:

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] 

Non c'è traccia inclusa, che mostra il plugin non è ancora eseguita (anche se la prima riga di codice lancia un'eccezione!).

Ho fatto un po 'di scavo e sembra che per questo client/istanza almeno: - Se includo un file di classe statico (public static class Foo) con qualsiasi metodo, ottengo questo errore, se la classe è effettivamente utilizzata da codice o non - Quando l'errore viene generato, il plugin stesso non viene eseguito (l'eccezione si verifica prima di qualsiasi codice)

Qualcuno ha visto qualcosa di simile prima o ha qualche intuizione sulle eccezioni System.TypeLoadException?

risposta

5

Ho appena provato questo plugin con un'istanza di prova di CRM Online (5.0.9690.3358) e funziona.

Il plug-in è registrato su Crea messaggio, Entità attività, Pre-operazione, Sincrona.

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); 
      } 
     } 

    } 
} 

Questo per accertarsi che il problema non sia il metodo di estensione.

La mia ipotesi migliore (in ordine):

  • Un progetto nella soluzione viene compilato con .NET Framework 4.5
  • Si sta utilizzando vecchia versione SDK
  • Si utilizza vecchio Plugin Registrazione Strumento
+1

Sì che l'ha inchiodato. Compilato contro. Net 4 (invece di 4.5) e funzionava bene. Grazie! – glosrob

0

Abbiamo avuto lo stesso problema con CRM 2011 On-premises sul server del cliente (2008 R2). Fortunatamente non è stato necessario tornare a .NET 4.0: l'installazione manuale di 4.5 sul server ha risolto il problema. Speriamo che il CRM online sarà aggiornato abbastanza presto.