I. Pré-requis

Pour une bonne compréhension de cet article, vous devez avoir un minimum de connaissances sur les langages et plates-formes suivants :

  • Le framework .net ;
  • Le langage de programmation C# ;
  • Le langage PHP.

II. Introduction

La communication entre des plates-formes différentes a toujours existé. Au fil des années l'évolution a permis le rapprochement entre sociétés. L'interopérabilité des langages est de plus en plus importante, surtout à travers le Web. Aujourd'hui, vous pouvez communiquer plus facilement avec les langages dynamiques sous licence payante et les solutions open source.

L'environnement .NET est une plate-forme de développement et d'exécution qui fait preuve d'une certaine maturité. Il est de plus en plus utilisé pour la réalisation des applications informatiques de nos jours.

Le Framework .NET fournit un environnement de programmation cohérent et orienté objet, c'est un environnement qui rend facile la création et le déploiement des applications.

Le langage PHP qui est l'un des langages les plus utilisés sur le web, permet, à partir de la version 4, d'exploiter les fonctionnalités des classes .NET, au sein d'une application PHP, assurant ainsi une interopérabilité entre le langage PHP et la plate-forme .NET.

Vous découvrirez, tout au long de cet article, comment créer et exploiter une classe du framework .NET dans une application PHP.

III. Environnement de travail

Pour réaliser l'exemple présenté ci-dessous nous avons utilisé les outils suivants :

  • PHP 5.3 ;
  • Visual Studio 2008 ;
  • .NET Framework 3.5 ;
  • IIS 6.0 (Cependant, rien ne vous empêche d'utiliser le serveur Apache à la place d'IIS).

Si vous ne disposez pas de Visual Studio, un simple éditeur de texte à l'instar du "Bloc-notes" sera suffisant dans le cadre de ce tutoriel.

IV. Utilisation des classes du framework .NET dans PHP

La classe DOTNET a été introduite dans PHP depuis la version 4.0, pour le support de la plate-forme .NET. La classe DOTNET permet, dans un programme PHP, d'instancier une classe depuis un assembly .NET signé et d'appeler, accéder et manipuler ses propriétés et méthodes.

Un assembly est une collection de types et de ressources générée pour fonctionner ensemble et former une unité logique de fonctionnalités. L'assembly est l'élément principal d'une application .NET.

Le constructeur de la classe DOTNET prend deux valeurs en paramètres à savoir :

  • assembly_name : qui spécifie quel assembly doit être chargé ;
  • class_name : qui spécifie quelle classe de l'assembly doit être chargée.

La syntaxe pour l'instanciation d'une classe .NET en utilisant la classe DOTNET est la suivante :

 
Sélectionnez

$obj = new DOTNET("assembly_name", "class_name")

$obj est un objet surchargé, chaque accès à une propriété ou méthode est effectué à travers COM (Component Object Model). Même pour les objets .NET, PHP utilise toujours COM.

COM permet à un objet d'exposer ses fonctionnalités à d'autres composants et d'héberger des applications. COM Interop intègre une compatibilité descendante, permettant aux clients COM d'accéder à du code managé, aussi simplement qu'à d'autres objets COM. COM Interop donne la possibilité d'exporter de façon transparente les métadonnées d'un assembly vers une bibliothèque de types. Il inscrit le composant managé en tant que composant COM standard et le rend accessible pour tout langage COM calling comme PHP.

Exemple d'utilisation d'une classe du framework .NET
Sélectionnez

<?php
$full_assembly_name = "mscorlib, Version=2.0.50727.1433, Culture=neutral, PublicKeyToken=b77a5c561934e089";
$stack = new DOTNET($full_assembly_name, "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Bonjour ");
echo $stack->Pop() . $stack->Pop();
?>

L'exemple ci-dessus permet de charger dans un programme PHP la classe System.Collections.Stack de l'assembly mscorlib et, ensuite, appelle la procédure Push de cette classe qui permet de créer et d'ajouter des valeurs à une simple collection non générique.

Pour utiliser une classe du framework .NET, vous devez, au niveau du paramètre assembly_name, renseigner toutes les informations d'identification de l'assembly de façon unique , à savoir : le nom de l'assembly, la version, la culture et le PublicKeyToken, suivant le format mentionné dans l'exemple ci-dessus. Ces informations sont disponibles dans le GAC (Global Assembly Cache).

V. Création et utilisation de nos propres classes managées .NET dans PHP

Dans cette partie nous allons voir comment créer notre propre classe, générer l'assembly correspondant et, ensuite, l'utiliser dans un programme PHP.

Pour utiliser un composant .NET en PHP, il faut placer le composant .NET dans le GAC(Global Assembly Cache). Contrairement à COM, .NET utilise le GAC et non le registre, pour trouver les composants.

V-A. Création de l'assembly

Pour la création de l'assembly, lancez votre EDI (Visual Studio).

A l'intérieur de Visual Studio créez un nouveau projet "Librairie de classe" avec, pour nom, TestDotNetPhp. Cliquez sur ok lorsque vous aurez terminé, comme illustré ci-dessous.

Image non disponible

Ajoutez la méthode suivante à "Class1" en vous assurant que la classe est déclarée "Public".

 
Sélectionnez

namespace TestDotNetPhp
{
    public class Class1
    {
        public string HelloWorld()
        {
            return "Bonjour le monde";
        }
    }
}

Si vous ne disposez pas de Visual Studio, copiez tout simplement les lignes de code ci-dessus, dans un fichier. Enregistrez-le ensuite, avec, pour nom, TestDotNetPhp.cs.

Pour notre exemple nous avons choisi d'utiliser le langage C#, vous pouvez utiliser n'importe quel autre langage .NET (VB.NET par exemple).

V-B. Signature de l'assembly

Pour pouvoir utiliser l'assembly dans le GAC (Globale Assembly Cache) celui-ci doit être signé et avoir un nom de clé fort. Tout assembly dans le GAC doit être identifié de façon unique et visionné.

La signature d'un assembly garantit l'intégrité et l'authenticité du contenu d'un programme.
La procédure de signature permet d'attribuer un nom fort (version, nom simple, clé publique, clé privée et culture) à un assembly.

V-B-1. Avec Visual Studio

Pour cela allez dans le menu projet, cliquez sur propriétés du projet et, ensuite, sur l'onglet signature.

Déroulez la zone " choisir un nom fort du fichier de clé " et cliquez sur nouveau comme l'illustre la figure ci-dessous.

Image non disponible

La fenêtre pour la définition du nom du fichier de clé s'affiche, renseignez-le. Pour notre cas nous avons choisi le nom "TestDotNetPhpKey ".

Désactivez l'option "protéger mon fichier de clé avec un mot de passe" (pas besoin d'une protection du fichier, pour un simple exemple d'illustration). Ensuite, cliquez sur ok, comme l'illustre la figure ci-dessous.

Image non disponible

Vous constaterez qu'à la racine du dossier contenant votre projet, un fichier TestDotNetPhpKey.snk a été généré.

Vous devez aussi vous assurer que votre assemby est un composant Com visible. Pour cela, dans les propriétés du projet cliquez sur l'onglet "Application" ensuite sur "Assembly Information".

Image non disponible

Enfin procédez à la compilation et à la génération de votre projet. Vous remarquerez qu'une DLL est générée dans le répertoire Debug, situé à la racine du dossier contenant votre projet.

V-B-2. Pour ceux ne disposant pas de Visual studio

Pour ceux ne disposant pas de Visual Studio, mais du framework .NET, la procédure de signature et de génération de l'assembly s'avère un peu plus complexe et n'est pas adaptée, dans le cas où vous voulez mettre sur pied une classe ayant des méthodes et des propriétés beaucoup plus complexes.

V-B-2-a. Création du fichier de clé

Il existe un utilitaire dans le framework .NET qui permet de signer un assembly et générer un fichier de clé. L'utilitaire "sn" se trouve dans le répertoire bin du framework .NET.

Pour créer un fichier de clé, lancez l'invite de commande et tapez la commande suivante :

 
Sélectionnez

sn  -k keyfilename.snk

Validez, ensuite, à l'aide de la touche "Enter" pour générer le fichier de clé .snk comme l'illustre la capture ci-dessous.

keyfilename représente ici le nom de votre fichier de clé .snk.

Image non disponible

Le fichier TestDotNetPhpKey.snk est généré dans le dossier contenant l'utilitaire "sn", soit le dossier bin du framework .NET.

Déplacez celui-ci dans le dossier contenant le fichier .cs.

V-B-2-b. Création d'un fichier de référence

Nous devons maintenant ajouter la clé que nous venons de créer à notre projet. Pour cela, copiez les lignes de code ci-dessous dans un fichier que vous nommerez AssemblyInfo.cs et sauvegardez-le dans le dossier contenant votre projet.

 
Sélectionnez

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
//On specifie le nom du fichier de clé utilisé
[assembly: AssemblyTitle("TestDotNetPhp")]
[assembly: AssemblyProduct("TestDotNetPhp")]
//On specifie que l'assembly sera visible com
[assembly: ComVisible(true)]
//On specifie la version de l'assembly
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

V-B-2-c. Création de l'assemby signé

Il nous faut maintenant compiler notre fichier pour générer la DLL correspondante. Pour cela nous allons utiliser l'utilitaire "csc", qui est le compilateur C# disponible dans le dossier bin du framework .NET (C:\WINDOWS\Microsoft.NET\Framework\v3.5).

La commande à utiliser est la suivante :

 
Sélectionnez

csc /target :library /out :C:\ProjetTest\Bin\TestDotNetPhp.dll C:\ProjetTest\*cs

/out permet de spécifier l'emplacement où sera générée la DLL.

Image non disponible

Cette commande permet de générer un assembly, en tenant compte de tous les fichiers se trouvant dans le dossier (fichier de clé, fichier de référence et fichier .cs).

V-B-2-d. Inscription de l'assembly

Pour rendre le composant Com visible afin que celui-ci soit accessible via Com Interop, il faut l'inscrire grâce à l'outil d'inscription des assemblys (regasm.exe, Assembly Registration Tool) disponible dans le SDK du Framework .NET (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727).

L'outil regasm crée une bibliothèque de type (TBL) et ajoute les informations concernant la classe dans le registre système, afin de permettre aux clients COM de l'utiliser.

 
Sélectionnez

regasm /tlb:TestDotNetPhp.tlb C:\ProjetTest\Bin\TestDotNetPhp.dll

V-C. Ajout de l'assembly dans le GAC

Nous devons maintenant ajouter notre assembly signé dans le GAC. Pour cela, nous allons utiliser l'utilitaire gacutil qui se trouve dans le dossier "C:\Program Files\Microsoft. SDKs\Windows\v6.0A\bin". En invite de commande nous allons utiliser la commande suivante.

 
Sélectionnez

gacutil -i C:\ProjetTest\Bin\TestDotNetPhp.dll

Vous pouvez voir tous les assembly enregistrés dans le GAC sur votre ordinateur dans le dossier C:\WINDOWS\assembly.

Image non disponible

V-D. Utilisation dans un programme PHP

Désormais dans notre script PHP nous pouvons faire appel à notre classe, en utilisant la classe DOTNET dont la syntaxe a été donnée plus haut.

 
Sélectionnez

<?php 
$full_assembly_name="TestDotNetPhp,"
      ."Version=1.0.0.0,"
      ."Culture=neutral,"
      ."PublicKeyToken=d490233e18165ed9";

$classphp = new DOTNET($full_assembly_name
      ,"TestDotNetPhp.Class1");

echo($classphp->HelloWorld());
?>

VI. Conclusion

La plate-forme .NET, de par la multitude de fonctionnalités et la souplesse d'utilisation qu'elle offre est une plate-forme de programmation de choix, dans l'environnement Windows. Le langage PHP, qui est l'un des langages les plus populaires dans le monde du développement web, prend depuis longtemps en charge les composants COM. Avec l'arrivée du .NET, celui-ci offre désormais la possibilité d'utiliser les classes .NET grâce à l'interopérabilité COM.

Cet article vous a présenté une méthode pour créer un assembly .NET et montré comment, grâce à l'interopérabilité Com Interop, vous pouvez exploiter les classes du framework .NET ainsi que vos propres classes managées .NET au sein d'un programme PHP.

Une autre possibilité serait d'utiliser des web services pour exploiter la force et la souplesse de la plate-forme .NET au sein de vos applications.

VII. Remerciements

Je tiens à remercier U. Milité pour sa relecture et correction orthographique.