2010-07-15 24 views
0

Juste en essayant de faire une légende (je pensais) simple pour lire un nombre à partir d'un fichier texte stocké sur le serveur CRM, utilisez il est l'une des valeurs du formulaire CRM, et incrémente le nombre, puis le réécrit dans le fichier texte. Lorsque je charge le formulaire, la légende ne fait ostensiblement rien et l'Observateur d'événements sur le serveur me donne ce message d'erreur de distribution invalide non utile. Je suis allé sur le code et a changé diverses choses en vain, mais je suis tout nouveau à deux appels CRM et C#, donc je suis probablement manquant quelque chose de stupide. Voici le code:CRM 3.0 légende ne fonctionne pas: événement: postcreate, exception: System.InvalidCastException: cast spécifié n'est pas valide

using System; 
using System.IO; 
using Microsoft.Crm.Callout; 

namespace IncrementCompetitorNumber 
{ 
    public class Increment 
    { 
     public string IncrementNumber() 
     { 
      string ProjectAutoNumber = "D:\\CRM_Misc\\incrementers\\new_competitornumber.txt"; 
      string AutoNumber = "0"; 
      string ReturnThis = "0"; 
      int i = 0; 

      lock(this) 

      { 

      TextReader tr = new StreamReader(ProjectAutoNumber); 

      AutoNumber = tr.ReadLine(); 

      tr.Close(); 

      ReturnThis = AutoNumber; 

      i = Convert.ToInt32(AutoNumber); 

      i++; 

      AutoNumber = i.ToString(); 

      TextWriter tw = new StreamWriter(ProjectAutoNumber); 

      tw.WriteLine(AutoNumber); 

      tw.Close(); 

      } 

      return ReturnThis; 
     } 
    } 
}

Alors ... quelqu'un sait ce que je fais mal?

Répondre

0

Il n'y a rien dans le codde que vous avez posté qui provoquerait une exception de transtypage non valide, sur quelle ligne l'exception se produit-elle? Une chose à mentionner est que le code que vous avez publié n'est pas une légende de CRM 3.0.

Une classe d'appel CRM 3.0 doit hériter de CrmCalloutBase et vous devez alors ignorer l'une des diverses méthodes d'événement telles que PostUpdate. Avez-vous fait cela ailleurs et appelez-vous cette classe à partir de là? OK à partir de votre deuxième commentaire, je sais ce que vous faites mal. Vous n'avez pas configuré votre classe corectly. Je suppose que vous voulez faire quelque chose avec la chaîne retournée à un moment donné mais je l'ai ignoré pour l'instant et la valeur sera simplement rejetée.

Modifier comme suit:

using System; 
using System.IO; 
using Microsoft.Crm.Callout; 

namespace IncrementCompetitorNumber 
{ 
    public class Increment : CrmCalloutBase 
    { 
     public override void PostCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, string postImageEntityXml) 
     { 
      IncrementNumber(); 
     } 

     private string IncrementNumber() 
     { 
      string ProjectAutoNumber = "D:\\CRM_Misc\\incrementers\\new_competitornumber.txt"; 
      string AutoNumber = "0"; 
      string ReturnThis = "0"; 
      int i = 0; 

      lock(this) 

      { 

      TextReader tr = new StreamReader(ProjectAutoNumber); 

      AutoNumber = tr.ReadLine(); 

      tr.Close(); 

      ReturnThis = AutoNumber; 

      i = Convert.ToInt32(AutoNumber); 

      i++; 

      AutoNumber = i.ToString(); 

      TextWriter tw = new StreamWriter(ProjectAutoNumber); 

      tw.WriteLine(AutoNumber); 

      tw.Close(); 

      } 

      return ReturnThis; 
     } 
    } 
} 
+0

Malheureusement, je ne sais pas quelle ligne l'erreur se produit sur. Le seul endroit où je reçois une erreur est dans EventViewer, et c'est tout ce qu'il dit: Erreur: code ISV jeté exception: assembly: IncrementCompetitorNumber.dll; class: IncrementCompetitorNumber.Increment; entity: new_localcompetitor, événement: postcreate, exception: System.InvalidCastException: la distribution spécifiée n'est pas valide. à Microsoft.Crm.Callout.CalloutHost.PostCreate (CalloutUserContext userContext, CalloutEntityContext entityContext). En ce qui concerne l'utilisation: Je le construis dans un fichier .dll et le place dans le répertoire \ bin \ assembly – extarbags

+0

... dans le répertoire CRM à côté de Microsoft.Crm.Platform.Callout.Base.dll. Voici la partie pertinente de mon fichier Callout.config.xml: \t \t \t \t new_competitornumber \t \t extarbags

+0

Pouvez-vous publier votre code qui appelle la méthode IncrementNumber. La cause la plus probable est ce que vous faites avec la valeur de retour. –