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

Posted

技术标签:

【中文标题】如何在 Tridion 中为 C# TBB 添加第三方 dll?【英文标题】:How to add third party dll in Tridion for C# TBB? 【发布时间】:2012-05-08 01:15:33 【问题描述】:

我正在创建一个 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>

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”标签出现了多次。我需要提取每个“body”标签内容。为此,我正在使用 HTML 敏捷包。为了使其在 C# TBB 中工作,如何将 HTML 敏捷包 DLL 添加到 Tridion 系统?并且还请提供一个示例代码sn-p in html agility 来遍历body标签。

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

提前致谢。感谢您尽早回复。

【问题讨论】:

【参考方案1】:

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

【讨论】:

记得将 DLL 放在每台内容管理器和发布者机器上的 GAC 中。【参考方案2】:

使用 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(免费) 在您的模板解决方案中,创建一个名为 Solution Items 的文件夹并将 ilmerge.exe 复制到那里。

打开模板项目的属性并添加以下构建后事件:

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

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

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

【讨论】:

【参考方案3】:

认为您也可以使用ILMerge 将您的第三方 DLL 和您的 TBB 程序集合并为一个,然后您可以上传到 Tridion。

【讨论】:

是的,你可以,我有很好的经验。我没有提到它的唯一原因是,将您自己的 DLL 与第三方 DLL 合并可能很容易导致侵犯版权。只要您确定这不会成为问题,您也可以使用该方法。我将在单独的答案中提供更多详细信息。 我认为没有版权问题。版权是关于源代码的。如果有人不想使用他们的 IL,那么他们不应该发布程序集 DLL,因为这实际上是在发布 IL。当然,您可能违反了许可条件,但这是另一个问题,我从未见过禁止这种技术的条件。不利的一面是,使用 ILMerge 可能会导致一些令人讨厌的副作用。我最近遇到了一个 Tridion 修补程序的问题,AFAIK 只会出现在 ILMerge 方法中

以上是关于如何在 Tridion 中为 C# TBB 添加第三方 dll?的主要内容,如果未能解决你的问题,请参考以下文章

Tridion 2009 SP1 TcmUploadAssembly 无法覆盖现有的 TBB

在 Tridion 2011 中部署 PDF 的最简单方法

在 SDL Tridion 2011 的 Dreamweaver 模板构建块中处理多个组件演示

如何在 C# 中为我的控件添加移动效果?

在使用 EF 期间如何在 c# 中为类添加额外的属性

如何在 C# 中为类名起别名,而不必向使用该类的每个文件添加一行代码?