我正在尝试CRM插件。我的最终目标是创建一个插件,它将运行另一个程序,该程序只是将项目凭证添加到excel文件中。对于我的样例项目,我基本上只是遵循了https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/tutorial-write-plug-in。这里提供的例子非常好,教会了我很多关于插件的知识。我遇到的问题是,每当我试图执行教程中没有涉及的代码时,我都会得到一个错误,调试过程甚至都没有达到我的中断点。当我从函数中删除我的个人代码时,它工作得很好。
public class PostCreateContact : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
//Process firstProc = new Process();
//firstProc.StartInfo.FileName = "notepad++.exe";
//firstProc.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
//firstProc.EnableRaisingEvents = true;
//firstProc.Start();
if (context.InputParameters.Contains("Target")&& context.InputParameters["Target"] is Entity)
{
Entity entity = (Entity)context.InputParameters["Target"];
try
{
Entity followup = new Entity("task");
followup["subject"] = "Send e-mail to the new customer.";
followup["description"] = "Follow up with the customer. Check if there are any new issues that need resolution.";
followup["scheduledstart"] = DateTime.Now;
followup["scheduledend"] = DateTime.Now.AddDays(2);
followup["category"] = context.PrimaryEntityName;
if (context.OutputParameters.Contains("id"))
{
Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString());
string regardingobjectidType = "contact";
followup["regardingobjectid"] = new EntityReference(regardingobjectidType, regardingobjectid);
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
service.Create(followup);
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException(ex.Message);
}
}
}
}我注释掉的5行代码是我提到的个人代码。如果我取消注释掉这些行。代码不会命中我的中断点。我的中断点设置在"public void Execute(IserviceProver servicerProvider)“行下面。有人能解释一下为什么每当我插入自己的代码来执行与CRM无关的任务时,它就会立即失败吗?
此外,除了尝试打开notepad++之外,尝试抛出消息框也不会起作用。
发布于 2019-03-15 05:49:01
插件的本质是它们对Dynamics 365系统中的数据进行操作,或者通过HTTP或HTTPS与外部世界通信。写入本地文件超出了插件的设计范围。
让插件与外部世界通信的一种方法是编写一个Azure-aware plugin。
如果你的系统是预置的,在the sandbox之外注册你的插件将提供更大的灵活性,尽管写到本地文件,即使它在技术上是可行的(我不相信它是)仍然是一个糟糕的做法。
要以受支持的方式向用户发送文件,您可以将该文件创建为备注附件。完成后,您只需在Dynamics 365中通过电子邮件向用户发送该备注的链接。
如果你希望文件在Dynamics 365之外可用,你可以触发一个Azure感知插件,该插件的基于Azure的侦听器将检索笔记附件文件,将其上传到云文件服务,如SharePoint或OneDrive,然后通过电子邮件向用户发送指向该文件的链接。
由于即使是沙箱插件也可以使用HTTPS,因此您可以让插件直接将文件上传到外部云主机,但身份验证可能会变得棘手。而且,根据上传速度和文件大小,您可能会遇到沙箱的2分钟超时。
如今的标准做法是假设有一天任何本地系统都可能在线,因此将所有代码设计为在沙箱中运行。
发布于 2019-03-16 00:44:13
我将继续关注Aron为那些更具视觉能力的学习者所做的出色回答。下面是在CRM中执行普通CRUD操作时发生的情况:

插件本身在步骤2或4中执行,这取决于您如何注册它,但不管怎样,它是在一个在线沙箱进程中执行的,该进程与云中正在处理它的机器上的所有其他进程是隔离的。沙箱对您的代码施加了额外的限制,其中之一就是磁盘访问。您无法从插件访问硬盘的任何部分,因此尝试读取或写入文件将失败。而且试图打开一个应用程序是没有意义的,因为即使它被允许,它也会在微软云中某个网络农场的某个网络服务器上打开,而不是在你的本地机器上。
https://stackoverflow.com/questions/55171488
复制相似问题