Dans un développement Biztalk, les orchestrations sont vraiment des éléments à part. Une des choses surprenantes à propos des orchestrations, est qu’il est possible de reconstituer complètement le code source à partir des binaires déployés sur un serveur Biztalk !
Le code source d’une orchestration est constitué de deux parties équivalentes :
- La description en langage XML
- Le code en langage X# / XLang
Ainsi l’orchestration qui suit, si elle est éditée en mode texte, révèle ces deux représentations :

Extrait de la représentation XML :
<om:MetaModel MajorVersion="1" MinorVersion="3" Core="2b131234-7959-458d-834f-2dc0769ce683" ScheduleModel="66366196-361d-448d-976f-cab5e87496d2" xmlns:om="http://schemas.microsoft.com/BizTalk/2003/DesignerData">
<om:Element Type="Module" OID="975df074-054b-4be6-8d96-37fdc5bc50e8" LowerBound="1.1" HigherBound="30.1">
<om:Property Name="ReportToAnalyst" Value="True" />
<om:Property Name="Name" Value="OrchestrationDecompilation" />
<om:Property Name="Signal" Value="False" />
<om:Element Type="PortType" OID="bc0ad3f4-6730-41f1-b7f6-b5644638bca8" ParentLink="Module_PortType" LowerBound="4.1" HigherBound="11.1">
<om:Property Name="Synchronous" Value="False" />
<om:Property Name="TypeModifier" Value="Internal" />
<om:Property Name="ReportToAnalyst" Value="True" />
<om:Property Name="Name" Value="prtTMoto" />
<om:Property Name="Signal" Value="True" />
…
Extrait de la représentation X#:
module OrchestrationDecompilation
{
internal porttype prtTMoto
{
oneway ProcessMoto
{
Moto
};
};
internal service SampleOrchestration
{
port implements prtTMoto prtMotoIN;
port uses prtTMoto prtMotoOut;
message Moto msgMoto;
body ()
{
activate receive (prtMotoIN.ProcessMoto, msgMoto);
System.Diagnostics.Trace.WriteLine("Plein effectué!");
send (prtMotoOut.ProcessMoto, msgMoto);
}
}
}
Lors de la compilation de notre orchestration, le code X# est pré-compilé en C# puis ce dernier est compilé en MSIL.
Cependant la classe qui est généré contient une propriété odXml qui renvoi la description de l’orchestration en XML … (cette propriété est notamment utilisée par le debugger d’orchestration). On peut également accéder au champ statique : _symODXML, c’est ce que nous allons faire pour éviter d’instancier l’orchestration.
Etant donné que la représentation XML est équivalente à la représentation X# il est possible de régénérer le X# à partir du XML.
En pratique cela se fait en quelques étapes :
La première étape consiste à extraite la définition ODXML et à la stocker dans un fichier :
Type orcht = typeof(OrchestrationDecompilation.SampleOrchestration);
FieldInfo fli= orcht.GetField("_symODXML",BindingFlags.NonPublic
|BindingFlags.Static);
File.WriteAllText("test.odx", (string)fli.GetRawConstantValue());
La seconde étape est nécessaire pour permettre l’édition du fichier odx dans VisualStudio.Il s’agit d’encadrer le XML par une directive (en vert) :
#if __DESIGNER_DATA
#error Do not define __DESIGNER_DATA.
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<om:MetaModel MajorVersion='1' MinorVersion='3'
…
#endif // __DESIGNER_DATA
Il est maintenant possible d’ouvrir notre orchestration dans Visual Studio.
La dernière étape consiste à générer le code X#. Visual Studio le fait automatiquement à condition que l’on effectue une modification dans l’orchestration. Il nous suffit par exemple d’éditer l’expression de notre orchestration.
Avec cette dernière étape nous avons reconstitué le « source » de notre orchestration.