4

私のC#テンプレートビルディングブロックの1つに、次のコード行があります

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

カスタム リゾルバーを実装する前は、このコードは非常に高速に実行されていました。リゾルバーが Publication ItemType 用に実装されたので、コードの実行が非常に遅くなりました。このことから、新しい Resolver がメソッドによって舞台裏で呼び出されていると結論付けGetListPublishItems()ます (これは理にかなっています)。どうにかしてリゾルバーを変更する必要があると思います。ただし、メソッドが呼び出されたときにリゾルバーのブレークポイントに到達できないようです。

私は通常、テンプレートをデバッグするときに「TcmTemplateDebugHost」にアタッチするか、リゾルバーをデバッグするときにパブリッシャー プロセスに直接アタッチします。私のリゾルバーは、GetListPublishItems() メソッドが呼び出されたときではなく、最初に発行を押したときにのみヒットするようです。

したがって、この質問は 2 つあります。

  1. GetListPublishItems() メソッドを使用すると、リゾルバーが呼び出されますか?
  2. それらが呼び出されたと仮定すると、このシナリオでデバッグする必要がある場合、どのプロセスにアタッチする必要がありますか?
4

1 に答える 1

5

確かなことはわかりませんが、カスタム リゾルバーが GetListPublishItems() に関与しないという健全なシナリオを想像することはできません。あなたの証拠はこれを裏付けているようですが、もちろん、あなたの質問の 2 番目の部分に答えることができれば、それは確実にわかります。

ホスティング プロセスに関する通常の仮定はおそらく正しいと思います。たとえば、パブリッシュ中にテンプレートを呼び出す場合、TcmPublisher がプロセスになります。または、GUI でパブリケーションのパブリッシュ ダイアログを開いて [パブリッシュするアイテムを表示] をクリックすると、おそらく COM サロゲート プロセス (dllhost.exe) などになります。ただし、確実に確認する 1 つの方法は、Sysinternals Process Explorer を使用することです。これには、特定の dll が読み込まれているプロセスを検索できる非常に便利な機能があります。(検索メニューを見てください)

ブレークポイントがバイトに失敗する原因の 1 つとして、Visual Studio がシンボルを正しく読み込めないことが考えられます。テンプレート ビルディング ブロックをデバッグしている場合、Tridion は既知の場所 (CM 構成の tridion.templating/debugging/@pdbdirectory) からシンボルを明示的に読み込みます。この場所は、テンプレート アップローダーが PDB を配置する場所です。パブリッシャー プロセスがカスタム リゾルバーを読み込むとき、シンボルを見つけるためのそのような特別なメカニズムがあるかどうかは疑問なので、標準の .NET メソッドにフォールバックする必要があります。私が最初に試みることは、カスタム リゾルバー クラスのシンボルがアセンブリと同じ場所 (つまり、bin ディレクトリ) にあることを確認することです。おそらく、Visual Studio でシンボル パスを構成できませんでした。

最初に行うことは、Visual Studio でデバッグ出力を確認することです。プロセスを開始してそれにアタッチすると、さまざまなアセンブリが読み込まれていることがわかります。Visual Studio がシンボルを見つけることができれば、出力に "Symbols Loaded" と表示されます。

于 2012-04-25T06:55:02.170 に答える