I understand C# Code Fragments and .NET Assemblies offer the same functionality for modular template development. We manage the code fragments in the CME and assembly code in Visual Studio, but use both the same way in Template Builder.
In terms of code, I can create a C# Code Fragment Template Building Block (TBB), for example:
var timeStamp = DateTime.Now.ToString("d MMM yyyy");
package.PushItem("timeStamp from fragment", package.CreateHtmlItem(timeStamp));
I can also create a .NET assembly Template Building Block using the same code by implementing ITemplate as below.
using System;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;
namespace CreateAndBreakTemplates
{
[TcmTemplateTitle("Add Date to Package")]
public class AddDateToPackage : ITemplate
{
public void Transform(Engine engine, Package package)
{
var timeStamp = DateTime.Now.ToString("d MMM yyyy");
package.PushItem("timeStamp from assembly",
package.CreateHtmlItem(timeStamp));
}
}
}
The docs explain that “SDL Tridion inserts the code fragment in its predefined method of a predefined class.” It looks like this class implements ITemplate and adds some references below (am I missing anything?).
The assembly setup instructions mention at least these dlls.
- Tridion.Common.dll
- Tridion.ContentManager.dll
- Tridion.ContentManager.Templating.dll
- Tridion.ContentManager.Publishing.dll
Any other difference between fragment and assembly and how would you choose between the two?
A C# fragment is compiled into an assembly by Tridion when the template is first invoked and after it’s been modified. To compile the fragment, Tridion wraps it in some “dungeon dressing” (bonus points for those who know where that term comes from) that:
Tridion.ContentManager,Tridion.ContentManager.CommunicationManagement,Tridion.ContentManager.ContentManagementandTridion.ContentManager.TemplatingnamespacesPackageandEngineavailable in fields calledpackageandenginerespectivelylogusingfor their namespaces yet)Edit: given the other answers it seems many people are not aware of how to accomplish certain tasks in C# fragment TBBs, so I’ll document them below:
Import additional namespaces
To import/use additional namespaces into your C# fragment, you need to use this syntax:
Note that this will only import namespaces from assemblies that are already referenced by Tridion. There is no mechanism for you to add references to other assemblies explicitly; so if you need a third-party DLL, you will need to add it to the GAC.
Defining custom functions
You can define custom fields and functions in your C# fragment by using this syntax:
Defining member fields and (nested) classes
The syntax for defining custom functions also allows you to define nested classes and/or member fields: