Dynamics CRM 客户端的插件调试

一直以来,Dynamics CRM插件在大家的印象中都是不便于调试的,根据官方文档(http://technet.microsoft.com/zh-cn/library/gg328574.aspx),调试插件分为两步:

  1. 注册插件
  2. 在要运行插件的 Microsoft Dynamics CRM 服务器上,将调试程序附加到进程

这步骤不仅繁琐,而且在调试出错需要修改代码,还必须在修改代码后重新注册插件,然后继续第二个步骤,这样不仅繁琐低效,而且因为调试占用进程而导致服务器无响应。这在多人共享一个CRM环境的情况下是很痛苦。

今天介绍一个全新的调试方法,这个方法有两个非常吸引人的优点:

  1. 不需要注册插件,调试过程简单
  2. 修改完代码之后可直接按F5运行,非常符合编写一般C#代码的习惯。

那么废话不多说,先看效果:

按F5运行断点到处:

跳过断点没发现异常,可以看到客户实体多了一条数据(这条数据可是在插件没有注册的情况下生成的哦):

完美运行!!!

下面介绍配置方法:

首先需要下载:Rhino.Mocks

1、插件编写完成之后,右击解决方案

2、选择测试项目

3、添加方框中的引用(三个CRM程序集、Rhino.Mocks,还有箭头所指的插件程序集)

4、在测试项目中,添加测试代码

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using account_plugins; namespace PA1130101PluginTest
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{ //跨域调试采用这个URL,同域用http://me-crm-01/crm即可
string server = "Url=http://me-crm-01/crm;Domain=myron;Username=fanfan;Password=Password01!"; var myConnection = CrmConnection.Parse(server); IServiceProvider serviceProvider = MockRepository.GenerateMock<IServiceProvider>();
IPluginExecutionContext context = MockRepository.GenerateMock<IPluginExecutionContext>();
IOrganizationServiceFactory factory = MockRepository.GenerateMock<IOrganizationServiceFactory>();
IOrganizationService service = MockRepository.GenerateMock<IOrganizationService>();
service = new OrganizationService(myConnection); ParameterCollection paramBag = new ParameterCollection(); //模拟被触发实体的那条数据
Entity currentent = new Entity("account");
//客户名称为张三的数据的GUID
currentent.Id = Guid.Parse("B3CE8D5D-2672-E311-A822-00155D016509");
paramBag.Add("Target", currentent); context.Stub(x => x.InputParameters).Return(paramBag);
serviceProvider.Stub(x => x.GetService(typeof(IPluginExecutionContext))).Return(context);
serviceProvider.Stub(x => x.GetService(typeof(IOrganizationServiceFactory))).Return(factory);
factory.Stub(x => x.CreateOrganizationService(null)).Return(service); //调用插件,将封装好的serviceProvider传进去
Test test = new Test();
test.Execute(serviceProvider);
}
}
}

5、设置测试项目为启动项目

至此,就可以直接在本地运行调试插件而不用官方繁琐的方法了。

更新和查询测试

最开始的演示中,测试了添加数据,在crm中,我们还需要查询和更新数据,下面我用一段代码演示。

需求:插件运行时需要将关联的主要联系人的【电子邮件】的值给到张三的电子邮件字段上。

插件代码:

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query; namespace account_plugins
{
public class Test : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as IPluginExecutionContext;
IOrganizationServiceFactory factory = serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as IOrganizationServiceFactory;
IOrganizationService service = factory.CreateOrganizationService(null);
Entity curEntity = context.InputParameters["Target"] as Entity;
//createAccount(service); UpdateAccount(service, curEntity);
} private void UpdateAccount(IOrganizationService service, Entity curEntity)
{
//查询当前实体所有数据,
Entity entCur = service.Retrieve(curEntity.LogicalName, curEntity.Id, new ColumnSet(true));
string email = string.Empty; if (entCur.Attributes.Contains("primarycontactid")) {
EntityReference refContact = (EntityReference)entCur.Attributes["primarycontactid"];
Entity contact = service.Retrieve(refContact.LogicalName, refContact.Id, new ColumnSet(true)); if (contact.Attributes.Contains("emailaddress1")) {
email = contact.Attributes["emailaddress1"].ToString();
}
} if (!string.IsNullOrEmpty(email)) {
//如果联系人的电子邮件不为空,则更新客户实体
curEntity.Attributes["emailaddress1"] = email;
service.Update(curEntity);
} } /// <summary>
/// 创建一条客户数据
/// </summary>
/// <param name="service"></param>
private void createAccount(IOrganizationService service)
{
Entity ent = new Entity("account");
ent.Attributes["name"] = "王五";
ent.Attributes["telephone1"] = "1122334455";
service.Create(ent);
}
}
}

运行效果:

成功查询到数据:

查询到了email

插件调试完毕

可以看到在张三的电子邮件已经更新成功

终于写完了,这篇博客从2013年写到2014年,真正的跨年博客。

新的一年,希望有个好的开始,希望Dynamics CRM会更好,更强大。

 
 
分类: Dynamics CRM
标签: Dynamics CRM

Dynamics CRM 客户端的插件调试的更多相关文章

  1. Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...

  2. Dynamics CRM 客户端程序开发:自定义系统标准按钮的可用性

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复125或者20140414可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 一般是新建一个解决方案用于客制化 ...

  3. Dynamics CRM不发布JS调试

    本博客已迁移至   http://www.krely.cn/ 上个项目做了一年多,大多是在做JS的开发,由于开发人数比较多,着实被坑的不轻.因为JS修改完成之后必须要发布,对于我们动辄几千行的JS的调 ...

  4. Dynamics CRM 多个Form显示不同的Ribbon按钮

    昨天群里熊宸(Microfoft MVP)给大家分享了以“Dynamics CRM 客户端编程概况”为主题,在群里给大家做了一次精彩的分享. 一些朋友聊到了Ribbon按钮在Form上的显示问题,因为 ...

  5. Dynamics CRM命令栏定制基础知识及手动编辑customization.xml实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复166或者20151028可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的博文:Dynamics C ...

  6. Dynamics CRM定制子网格添加按钮实例之一

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复221或者20160430可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  7. Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话

    背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...

  9. Dynamic CRM插件调试与单元测试

    背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...

随机推荐

  1. Visual Studio Code开发TypeScript

    [Tool] 使用Visual Studio Code开发TypeScript   [Tool] 使用Visual Studio Code开发TypeScript 注意 依照本篇操作步骤实作,就可以在 ...

  2. 如何使用Ubuntu打电话

    在这个视频,我们学习如何使用Ubuntu打电话.Ubuntu手机的很多用户谁是不是很熟悉. 特别是,他什么都无所谓的物理按键(菜单键.home纽带.回车键).然后用户如何控制手机它?Ubuntu手机凭 ...

  3. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  4. cralwer_爬虫代理中心的简要设计

    代理中心: 简单讲: 精细化控制限制资源的使用,保证有限资源的充分利用及有效性.支持动态增减,实时更新. 需求 rest api提供请求输入与输出 客户端使用代理心跳接收,用于更新代理的使用次数,被占 ...

  5. oracle_安装_win7+64位+Oracle+11g+64位下使用PLSQL+Developer+的解决办法

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...

  6. uva 12003 Array Transformer (大规模阵列)

    白皮书393页面. 乱搞了原始数组中.其实用另一种阵列块记录. 你不能改变原始数组. 请注意,与原来的阵列和阵列块的良好关系,稍微细心处理边境.这是不难. #include <cstdio> ...

  7. 【百度地图API】如何自定义地图图层?实例:制作麻点图(自定义图层+热区)

    原文:[百度地图API]如何自定义地图图层?实例:制作麻点图(自定义图层+热区) 摘要:自定义地图图层的用途十分广泛.常见的应用,比如制作魔兽地图和清华校园地图(使用切图工具即可轻松实现).今天我们来 ...

  8. NDMCDB数据库hang住故障分析 - cursor: pin S wait on X

    问题描写叙述: 上午刚刚到办公室,就有监控人员邮件反馈,昨晚NDMCDB407数据库被重新启动过,让我分析一下数据库重新启动的原因.因为昨晚业务有版本号上线,所以短信警告关闭了,所以没有短信下发到我手 ...

  9. krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)

    需求: 实现音量控制,这是官网的样例, 本文已经转移 到 krpano中文网 p=148">http://krpano360.com/? p=148 很多其它教程关注微信公众号 krp ...

  10. asp.net 给按钮 增加事件

    一个页面,有查询,审核,删除,取消审核 按钮,每次结尾 处都要 调用 Initdata方法,重新刷新数据 繁琐哇,我的解决方法是 protected void Page_Load(object sen ...