如何在Tridion中为C#TBB添加第三方dll?
我正在创建一个C#TBB。 我有如下所示的XML代码如何在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> <
<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())));
}