« The technical news of the day | Main | Common garbage collection problems and how they are reflected in the views »

Traduction de code VB.NET <-> C#

Il existe un moyen rapide pour traduire du code .NET, de C# a VB.NET et vice-versa, ce qui peut etre utile s'il y a besoin de reutiliser du code .NET ecrit dans un langage dans un projet qui l'est dans un autre. C'est tres simple et on utilise des outils du domaine public, gratis, gratos, free, nicht so viel geld zu kaufen, nada de nada.

1) Dans http://www.aisto.com/roeder/dotnet/ vous trouverez un outil absolument fantastique de desassemblage d'assemblies .NET appele "Reflector", qui permet de voir la structure interne des assemblies (types, methodes, etc) et vous offre la possibilite de les desassembler et de voir le code source a l'interieur, en VB.NET, C#, Delphi ou MSIL. Indispensable dans tout toolbox de developpeur .NET :)

Il n'y a pas d'installeur, simplement glissez Reflector.exe dans votre disque dur, et c'est tout.

2) Il y a un "plug-in" pour Reflector, qui permet de faire un output en forme de fichier du desassemblage des assemblies: http://www.denisbauer.com/NETTools/FileDisassembler.aspx

Dezippez le fichier, dedans il y a une DLL que vous devrez placer a cote de Reflector.exe, simplement.

3) Ensuite ouvrez Reflector, et dans le menu Add-ins (voir image) ajoutez la DLL contenue dans le fichier Reflector.FileDisassembler.Addin.zip.

lutzroederreflector.gif

4) Compilez votre projet .NET, dans le langage de votre choix (en Debug ou Release, peu importe, mais attention si vous avez des regions de code specifiques pour chaque configuration)

5) Ouvrez la DLL resultante de l'etape 4 dans Reflector, selectionnez l'assembly que vous voulez (une DLL peut contenir plusieurs assemblies, mais Visual Studio ne cree qu'un seule assembly par DLL), et choissisez votre langage de choix dans le menu.

6) Dans le menu Tools vous trouverez une option "File Disassembler": specifiez un dossier dans votre disque dur, et cliquez "Generate"

Et toc! Vous venez de traduire le code source d'un langage a l'autre. Essayez!

L'outil de traduction, evidemment, n'est pas parfait: j'ai constate les problemes suivants lors de la traduction:

1) Les namespaces dans les projets VB peuvent etre specifies dans le fichier vbproj, et donc, les fichiers C# resultants n'incluent pas cette information; il faut l'ajouter manuellement (tout comme les references aux assemblies externes). Le compilateur vous donnera plus de details a ce sujet.

2) Les boucles du type

sont traduites exactement comme elle sont compilees, c'est a dire, en utilisant les methodes primitives d'iteration de .NET: concretement, le code C# resultant a la forme suivante:

Le probleme est que le compilateur C# va se plaindre a la ligne 14 du code ci-dessus, puisque la variable enumerator1 n'est pas garantie a 100% d'etre differente de null lors de l'execution (!) donc, le code ne compile pas (le compilateur C# est particulierement pointilleux). Pour y remedier, on peut sans autre remplacer manuellement le code ci-dessus par son equivalent ci-dessous:

qui est absolument equivalent, bien plus simple a lire et a maintenir, etc.

Bref, j'espere que cette information vous sera utile!