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.

 

 

 

Publié le 02/03/2008  par Roch Baduel