如何在 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