CRM 3.0标注不起作用:event:postcreate,exception:System.InvalidCastException:指定的强制转换无效

时间:2010-07-15 14:12:31

标签: c# dynamics-crm callouts dynamics-crm-3

只是尝试做一个(我想)简单的标注来从存储在CRM服务器上的文本文件中读取一个数字,将其用作CRM表单上的一个值,然后递增数字,然后将其重写为文本文件。当我加载表单时,callout表面上什么都不做,服务器上的事件查看器给了我这个无用的无效转换错误消息。我已经完成了代码并改变了各种各样的东西但无济于事,但我对CRM标注 C#都是全新的,所以我可能会遗漏一些愚蠢的东西。这是代码:

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

所以......任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

您发布的密码中没有任何内容会导致无效的强制转换异常,异常发生在哪一行?

有一点需要提及的是,您发布的代码不是CRM 3.0标注。

CRM 3.0标注类必须从CrmCalloutBase继承,然后您可以覆盖PostUpdate等各种事件方法之一。你有没有在其他地方做过这个并且从那里打电话给这个班级?

从第二条评论中确定我知道你做错了什么。你没有核心设置你的课程。我假设你想在某些时候对返回的字符串做一些事情,但我现在已经忽略了它,并且该值将被丢弃。

按如下方式更改:

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