2012-04-25 61 views
4

在我的C#模板構建模塊之一,我有代碼調試支持SDL Tridion 2011自定義衝突解決和GetListPublishItems()方法

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

以下行實現自定義解析,非常迅速地執行此代碼之前。現在我的解析器已經實現了Publication ItemType,代碼執行得非常慢。由此我得出結論:新的Resolver被GetListPublishItems()方法在後臺調用(這是有道理的)。我認爲我需要以某種方式修改解析器。但是,當調用方法時,我似乎無法在解析器中找到一個斷點。

我通常在調試模板時附加到「TcmTemplateDebugHost」,或者在調試解析器時直接附加到發佈者進程。當我第一次按下發布時,我的解析器似乎只會被命中,而不是在調用GetListPublishItems()方法時。

所以這個問題是雙重的:當GetListPublishItems()使用方法

  1. 待辦事項解析器被調用?
  2. 假設他們被調用,我需要在這種情況下調試時附加哪個進程?
+1

你有沒有試過用dotPeek(http://www.jetbrains.com/decompiler/)查看代碼? – 2012-04-25 06:39:45

+2

由於「顯示要發佈的項目」是GUI中的一個按鈕,我預計它將從服務主機進程調用。 – 2012-04-25 20:05:01

+1

他們被叫?是的,自2011年以來。我懷疑服務主機,但由於您使用COM方法調用它,您可能需要檢查dllhost進程。 – 2012-04-30 12:06:51

回答

5

我不確定,但我無法想象一個自定義解析器不會涉及GetListPublishItems()的理智場景。你的證據似乎支持了這一點,但當然,如果我們能夠回答你問題的第二部分,我們就會確定地知道它。

我想你對託管過程所做的任何正常假設都可能是正確的,例如,如果在發佈期間調用模板,那麼TcmPublisher將是過程。或者,如果要在GUI中打開發布的發佈對話框並點擊「顯示要發佈的項目」,那麼它可能是COM代理進程(dllhost.exe)......等等。但是,一種確定的方法是使用Sysinternals Process Explorer,它具有非常方便的功能,可以讓您搜索哪些進程已加載給定的dll。 (在「查找」菜單中查找)

斷點失敗的一個可能原因是Visual Studio無法正確加載符號。在調試模板構建塊時,Tridion會顯式地從可以配置的已知位置(CM配置中的tridion.templating/debugging/@pdbdirectory)加載符號,這是模板上載器放置PDB的位置。當發佈者進程加載自定義解析器時,我懷疑是否有任何這樣的特殊機制來定位符號,因此您必須回退到標準的.NET方法。我會嘗試的第一件事是確保您的自定義解析器類的符號位於與程序集相同的位置(即您的bin目錄)。否則你可能可以在Visual Studio中配置一個符號路徑。

要做的第一件事就是觀察Visual Studio中的調試輸出。如果您啓動該過程並附加到該過程,您將看到正在加載的各種組件。如果Visual Studio可以找到這些符號,您會看到輸出顯示「符號已加載」。