4

在我的 C# 模板构建块之一中,我有以下代码行

publication.GetListPublishItems(uriTarget, false, false,
         TDSDefinesInterop.ListColumnFilter.XMLListDefault, listRowFilter);

在实现自定义解析器之前,此代码执行得非常快。现在我的解析器是为 Publication ItemType 实现的,代码执行得非常慢。由此我得出结论,新的解析器正在由该方法在幕后调用GetListPublishItems()(这是有道理的)。我假设我需要以某种方式修改解析器。但是,当调用该方法时,我似乎无法在解析器中遇到断点。

我通常在调试模板时附加到“TcmTemplateDebugHost”,或者在调试解析器时直接附加到发布者进程。我的解析器似乎只在我第一次按下 Publish 时才被击中,而不是在调用 GetListPublishItems() 方法时。

所以这个问题是双重的:

  1. 使用 GetListPublishItems() 方法时是否调用解析器?
  2. 假设它们被调用,当我需要在这种情况下调试它时,我应该附加哪个进程?
4

1 回答 1

5

我不确定,但我无法想象自定义解析器不会参与 GetListPublishItems() 的合理场景。您的证据似乎支持这一点,但当然,如果我们能回答您问题的第二部分,我们肯定会知道。

我想您对托管过程所做的任何正常假设都可能是正确的,例如,如果您在发布期间调用模板,那么 TcmPublisher 将是该过程。或者,如果您要在 GUI 中打开发布的发布对话框并点击“显示要发布的项目”,那么它可能是 COM 代理进程 (dllhost.exe)...等等。但是,一种确定的方法是使用 Sysinternals Process Explorer,它有一个非常方便的功能,可以让您搜索哪些进程加载了给定的 dll。(查看“查找”菜单)

断点无法执行的一个可能原因是 Visual Studio 无法正确加载符号。当您调试模板构建块时,Tridion 会从已知位置显式加载符号,您可以配置该位置(CM 配置中的 tridion.templating/debugging/@pdb 目录),这是模板上传器放置 PDB 的位置。当发布者进程加载自定义解析器时,我怀疑是否有任何此类特殊机制来定位符号,因此您必须回退到标准的 .NET 方法。我要尝试的第一件事是确保自定义解析器类的符号与程序集位于同一位置(即您的 bin 目录)。如果失败,您也许可以在 Visual Studio 中配置符号路径。

首先要做的是在 Visual Studio 中观察调试输出。如果您启动该过程然后附加到它,您将看到正在加载的各种程序集。如果 Visual Studio 可以找到符号,您将看到输出显示“已加载符号”。

于 2012-04-25T06:55:02.170 回答