Partager via


Composant dans les extensions managées pour C++

Voici l'aspect du composant de chaîne simple dans les extensions managées pour C++ :

Listing 1. Composant dans les extensions managées pour C++ (CompVC.cpp)

#using <mscorlib.dll>
using namespace System;

namespace CompVC {
   __gc public class StringComponent {
   private:
      String* StringsSet[];

   public:
      StringComponent() {
         StringsSet = new String*[4];
         StringsSet[0] = new String(L"Visual C++ String 0");
         StringsSet[1] = new String(L"Visual C++ String 1");
         StringsSet[2] = new String(L"Visual C++ String 2");
         StringsSet[3] = new String(L"Visual C++ String 3");
      }

     String* GetString(int index) {
       if ((index < 0) || (index >= StringsSet->Length)) {
         throw new IndexOutOfRangeException();
       }
       return StringsSet[index];
     }

      __property int get_Count() { return 
         StringsSet->Length; }
      };

};

Comme indiqué précédemment, vous utilisez l'instruction namespace pour créer un nouvel espace de noms pour encapsuler les classes que vous allez créer :

namespace CompVC {

Notez que cet espace de noms peut être imbriqué et fractionné sur plusieurs fichiers. Un seul fichier de code source peut également contenir plusieurs espaces de noms qui ne sont pas imbriqués. Étant donné que l'espace de noms peut contenir des classes managées et non managées (contrairement aux espaces de noms dans Visual Basic et Visual C#, qui ne contiennent que des classes managées), vous devez utiliser le modificateur __gc pour spécifier que la classe StringComponent est managée :

__gc public class StringComponent {

Cette instruction signifie que les instances de StringComponent seront désormais créées par le Common Language Runtime et managées dans le tas du garbage collection. Vous pouvez également utiliser le commutateur de compilation /clr pour rendre toutes les classes du programme managées (qu'elles possèdent ou non le préfixe __gc).

Le constructeur de classe (qui exécute à chaque fois une nouvelle instance de la classe à créer) a le même nom que la classe et n'a pas de type de retour.

public:
    StringComponent() {

Voici la méthode GetString, qui prend un entier et retourne une chaîne :

String* GetString(int index) {
    ...
    return StringsSet[index];
}

L'instruction throw de la méthode GetString met en valeur la gestion des exceptions basées sur le runtime :

throw new IndexOutOfRangeException();

Cette instruction crée un nouvel objet de type IndexOutOfRangeException et lève une exception, qui est interceptée par l'appelant. Notez que la gestion des exceptions .NET nécessite que toutes les exceptions (y compris celles que vous définissez pour votre propre utilisation) doit dériver de System::Exception.

**Remarque   **Ce mécanisme de gestion des erreurs remplace celui basé sur hResult qui était utilisé dans des versions précédentes de COM.

Enfin, vous devez créer la propriété Count en lecture seule :

__property int get_Count { return StringsSet->Count; }

La création du nouveau composant des extensions managées pour C++ est un peu plus compliquée :

cl.exe /clr /Zi /c CompVC.cpp
link.exe -dll /debug /nod:libcpmt.lib kernel32.lib mscoree.lib /out:..\bin\CompVC.dll CompVC.obj

Comme pour l'exemple Hello World des extensions managées pour C++, le commutateur /clr est nécessaire pour indiquer au compilateur de créer un assembly de code managé .NET.

Pour une question de commodité, les exemples de composants de ce didacticiel sont conservés dans un sous-répertoire ..\Bin relatif au code source. Pour compiler le composant vers cet emplacement, vous devez simplement spécifier le nom de fichier qualifié à l'aide du paramètre /out. Vous pouvez également placer les composants compilés dans le cache de l'assembly, s'ils sont susceptibles d'être utilisés avec d'autres programmes. Et, bien que vous ayez spécifié un fichier de sortie avec une extension de nom de fichier .dll, le commutateur -dll supplémentaire est nécessaire pour créer une DLL plutôt qu'un fichier exécutable avec une extension de nom de fichier .dll.

Voir aussi

Composant dans Visual C# | Composant dans Visual Basic | Clients pour les composants simples | Résumé du didacticiel de développement | Annexe A : Outils pour l'exploration des espaces de noms