如何在Tridion中为C#TBB添加第三方dll?

如何在Tridion中为C#TBB添加第三方dll?,c#,xml,html-parsing,tridion,C#,Xml,Html Parsing,Tridion,我正在创建一个C#TBB。 我有如下所示的XML代码 <content> <ah>123</ah> <ph>456</ph> <body> <sc>hi</sc> <value>aa</value> <value>bb</value> <value>cc</value> <

我正在创建一个C#TBB。 我有如下所示的XML代码

<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>
在XML代码中,“body”标记出现多次。我需要提取每个“body”标记的内容。为此,我正在使用HTML敏捷包。要使其在C#TBB中工作,如何将HTML agility pack DLL添加到Tridion系统中?另外,请提供一个html agility中的示例代码片段,以循环遍历body标记

如果HTML敏捷性不能与C#TBB一起使用,那么请建议我如何获取“body”标记内容


提前感谢。欢迎早日回复。

您需要将第三方DLL放置在全局程序集缓存(GAC)中。对于agility pack代码示例,我建议您单独提出一个问题,并给出更具体的标题

您还可以使用将第三方DLL和TBB程序集合并为一个单独的DLL,然后上载到Tridion中。

使用ILMerge可以省去在GAC中安装外部DLL的麻烦。只要确保你没有违反任何(版权)法律,将你的代码与其他人的代码合并。 从技术上讲,这非常简单:在构建了模板DLL之后,生成后操作会将其与可能需要的外部DLL合并,并创建一个新的DLL。然后可以将合并的DLL上载到Tridion

示例:假设您的模板项目名为“MyTemplates”,它依赖于ExternalLibraryOne.dll和ExternalLibraryTwo.dll。以下是您要做的:

  • 从下载ILMerge(免费)
  • 在模板解决方案中,创建一个名为“解决方案项”的文件夹,并将ilmerge.exe复制到该文件夹中
  • 打开模板项目的属性并添加以下生成后事件:

    “$(SolutionDir)解决方案项\ilmerge”
    /库:“C:\Windows\Microsoft.NET\Framework\v4.0.30319” /t:dll/targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /输出:“$(TargetDir)$(ProjectName).merged.dll” “$(TargetDir)ExternalLibraryOne.dll” “$(TargetDir)ExternalLibraryTwo.dll” “$(目标路径)”

  • 构建模板项目。输出文件夹(bin/Debug或bin/Release)现在将包含一个名为MyTemplates.merged.dll的文件。您可以使用TcmUploadAssembly将其上载到Tridion


当然,这是假设您使用的是.NET 4。

记住在每台content manager和publisher机器上的GAC中放置DLL。是的,您可以,我在这方面有很好的经验。我没有提到它的唯一原因是,将您自己的DLL与第三方DLL合并可能很容易导致版权侵权。只要你确信这不会成为问题,你也可以使用这种方法。我会在另一个答案中提供更多细节。我认为这不存在版权问题。版权与源代码有关。如果有人不想使用他们的IL,他们不应该提供程序集DLL,因为这实际上是在提供IL。当然,您可能违反了许可证条件,但这是另一个问题,我从未见过禁止此技术的条件。另一方面,使用ILMerge可能会导致一些严重的副作用。我最近遇到了一个Tridion修补程序的问题,AFAIK只会使用ILMerge方法出现
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())));
}