2012-04-27 64 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当然。