我创建了一个插件并使用 hte 注册工具注册了它。我还添加了一个步骤,该步骤应该处理创建实例的消息。可悲的是,预期的行为没有发生。
我的猜测是插件内部的某些东西崩溃了,但我不知道如何调试它。我理解,设置断点对在线版本不起作用,所以我什至没有尝试。
出于法律和技术原因,我也无法将解决方案转移到本地安装。猜我唯一的选择吗?
我创建了一个插件并使用 hte 注册工具注册了它。我还添加了一个步骤,该步骤应该处理创建实例的消息。可悲的是,预期的行为没有发生。
我的猜测是插件内部的某些东西崩溃了,但我不知道如何调试它。我理解,设置断点对在线版本不起作用,所以我什至没有尝试。
出于法律和技术原因,我也无法将解决方案转移到本地安装。猜我唯一的选择吗?
对于服务器端(插件),我使用的是ITracingService。对于客户端,我将所有内容记录到控制台。第一个的缺点是您实际上需要使执行崩溃才能看到任何内容。后者的缺点是插件有时会在根本没有调用 GUI 的情况下执行。
当涉及到较重的项目时,我只需设置一个从插件调用并写入的 WCF Web 服务。这样,在一个屏幕上,我正在执行插件,而在另一个屏幕上,我得到了一个不错的日志文件(或者只是将发送的信息放在屏幕上)。
例如,您可以从对正在创建的实体实例上的字段进行非常基本的更新开始。当你有那个工作时,你总是可以回退到最后一个工作版本。如果您甚至无法使其正常工作,则可能意味着您错误地设置了插件注册。
一种非常有效的方法是将解决方案提升到您可以完全控制的本地版本,但我在您的问题中看到这不是一个选项。
如果您可以将解决方案提升到本地版本,这里有一个关于如何调试插件的链接。
不要忘记您也可以访问ITracingService
.
您可以在您的Execute
方法中获取对它的引用,然后在您的代码中经常写入它以记录您正在尝试或已成功执行的变量或操作过程。您还可以在发生异常时使用它来显示更有价值的信息。
这基本上就像写到控制台。然后,如果有任何事情导致插件在运行时崩溃,那么当您在向用户显示的错误上单击“下载日志文件”时,您可以看到您跟踪的所有内容。
但请注意 - 除非您的插件实际上抛出异常(故意或其他),否则您无法访问任何被跟踪的内容。
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the execution context from the service provider.
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(
typeof(IPluginExecutionContext));
// Get a reference to the tracing service.
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
try
{
tracingService.Trace("Getting entity from InputParameters...");
// may fail for some messages, since "Target" is not present
var myEntity = (Entity)context.InputParameters["Target"];
tracingService.Trace("Got entity OK");
// some other logic here...
}
catch (FaultException<OrganizationServiceFault> ex)
{
_trace.Trace(ex.ToString());
while (ex.InnerException != null)
{
ex = (FaultException<OrganizationServiceFault>)ex.InnerException;
_trace.Trace(ex.ToString());
}
throw new InvalidPluginExecutionException(
string.Format("An error occurred in your plugin: {0}", ex));
}
catch (Exception ex)
{
_trace.Trace(ex.ToString());
while (ex.InnerException != null)
{
ex = ex.InnerException;
_trace.Trace(ex.ToString());
}
throw;
}
}