2012-04-27 31 views
5

我正在創建一個C#TBB。 我有如下所示的XML代碼。如何在Tridion for C#TBB中添加第三方dll?

<content> 
    <ah>123</ah> 
    <ph>456</ph> 
    <body> 
    <sc>hi</sc> 
    <value>aa</value> 
    <value>bb</value> 
    <value>cc</value> 
    <value>dd</value> 
    <value>dd</value> 
    </body> 
    <body> 
    <sc>hello</sc> 
    <value>ee</value> 
    <value>ddff</value> 
    </body> 
</content> 

C#代碼TBB:

using (MemoryStream ms = new MemoryStream()) 
{ 
XmlTextWriter securboxXmlWriter = new XmlTextWriter(ms, new System.Text.UTF8Encoding(false)); 
securboxXmlWriter.Indentation = 4; 
securboxXmlWriter.Formatting = Formatting.Indented; 
securboxXmlWriter.WriteStartDocument(); 


securboxXmlWriter.WriteStartElement("component"); 

securboxXmlWriter.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
securboxXmlWriter.WriteAttributeString("xmlns", "http://www.w3.org/1999/xhtml"); 


securboxXmlWriter.WriteStartElement("content"); 
securboxXmlWriter.WriteStartElement("wire:wire"); 
securboxXmlWriter.WriteStartElement("wire:si"); 

securboxXmlWriter.WriteStartElement("wg:ah"); 
securboxXmlWriter.WriteElementString("text", package.GetValue("Component.ah")); 
securboxXmlWriter.WriteEndElement(); 

securboxXmlWriter.WriteStartElement("wg:ph"); 
securboxXmlWriter.WriteElementString("nlt", package.GetValue("Component.ph")); 
securboxXmlWriter.WriteEndElement(); 

securboxXmlWriter.WriteEndElement(); 
securboxXmlWriter.WriteEndElement(); 
securboxXmlWriter.WriteEndElement(); 
securboxXmlWriter.WriteEndElement(); 
securboxXmlWriter.WriteEndDocument(); 
securboxXmlWriter.Flush(); 
securboxXmlWriter.Close(); 



Item output = package.GetByName("Output"); 

if (output != null) 
{ 
package.Remove(output); 
} 

package.PushItem("Output", package.CreateStringItem(ContentType.Xml, Encoding.UTF8.GetString(ms.ToArray()))); 
} 

在XML代碼 「身體」 標籤發生多次。我需要提取每個「body」標籤內容。爲此,我使用HTML敏捷包。爲了使它在C#TBB中工作,如何將HTML敏捷包DLL添加到Tridion系統?還請提供一個html敏捷性示例代碼片段來循環訪問body標籤。

如果HTML Agility不能與C#TBB一起使用,那麼請向我推薦一種如何獲得「body」標記內容的方法?

在此先感謝。早期回覆讚賞。

回答

2

認爲您還可以使用ILMerge將您的第三方DLL和您的TBB彙編合併成一個單一的然後上傳到Tridion。

+2

是的,你可以,我有很好的經驗。我沒有提到它的唯一原因是,將自己的DLL與第三方DLL合併可能很容易導致版權侵權。只要你確信這不會成爲問題,你也可以使用這種方法。我將在單獨的答案中提供更多細節。 – Quirijn 2012-04-29 19:56:56

+0

我不認爲有版權問題。版權是關於源代碼。如果有人不想使用他們的IL,他們不應該發佈一個程序集DLL,因爲這有效地運送IL。當然,你可能違反許可條件,但那是另一個問題,我從來沒有看到禁止這種技術的條件。反過來說,使用ILMerge會導致一些令人討厭的副作用。我最近遇到了一個Tridion修補程序的問題,AFAIK只會用ILMerge方法顯示 – 2012-04-29 20:27:08

7

您需要將第三方DLL放入全局程序集緩存(GAC)中。對於示例敏捷包代碼,我建議您針對更具體的標題詢問另一個問題。

+3

請記住在每個內容管理器和發佈者計算機上將GAC中的DLL放入。 – Quirijn 2012-04-27 13:35:44

4

使用ILMerge可以讓您省去在GAC中安裝外部DLL的麻煩。只要確保你沒有違反任何(版權)法律,將你的代碼與別人合併。 從技術上來說,它足夠簡單:在模板DLL生成後,生成後操作將它與您可能需要的外部DLL合併,並創建一個新的DLL。然後,您可以將合併的DLL上傳到Tridion。

示例:假設您的模板項目名爲「MyTemplates」,並且它對ExternalLibraryOne.dll和ExternalLibraryTwo.dll具有依賴性。這裏就是你要做的:從http://www.microsoft.com/en-us/download/details.aspx?id=17630

  • 下載ILMerge(免費)
  • 內,您的模板解決方案,創建一個名爲解決方案項文件夾,複製ilmerge.exe那裏。
  • 打開您的模板項目的屬性,並添加以下生成後事件:

    「$(SolutionDir)解決方案項\ ilmerge」
    /lib:"C:\Windows\Microsoft.NET\Framework \ v4.0.30319" /噸:DLL /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:"$(TargetDir)$(ProjectName).merged.dll 「 」 $ (TARGETDIR)ExternalLibraryOne.dll」 「$(TARGETDIR)ExternalLibraryTwo.dll」 「$(TARGETPATH)」

  • 構建模板項目。輸出文件夾(bin/Debug或bin/Release)現在將包含一個名爲MyTemplates.merged.dll的文件。您可以使用TcmUploadAssembly將其上傳到Tridion。

這是假設您使用.NET 4當然。