Un componente nelle estensioni gestite per C++

Di seguito viene illustrato l'aspetto del componente stringa semplice nelle estensioni gestite per C++:

Listato 1. Componente nelle estensioni gestite per 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; }
      };

};

Come accennato in precedenza si utilizza l'istruzione namespace per creare un nuovo spazio dei nomi per incapsulare le classi che verranno create:

namespace CompVC {

Questo spazio dei nomi può essere nidificato nonché suddiviso su più file. In un singolo file di codice sorgente possono inoltre essere contenuti più spazi dei nomi non nidificati. A differenza degli spazi dei nomi in Visual Basic e Visual C#, che possono contenere solo classi gestite, nelle estensioni gestite di C++ lo spazio dei nomi può contenere sia classi gestite che non gestite e pertanto si utilizza il modificatore __gc per specificare che la classe StringComponent è gestita:

__gc public class StringComponent {

Questa istruzione indica che ora verranno create istanze di StringComponent da Common Language Runtime e che tali istanze verranno gestite nell'heap di Garbage Collection. Sarebbe stato possibile utilizzare anche l'opzione di compilazione /crl per generare nel programma solo classi gestite, indipendentemente dalla presenza del prefisso __gc.

Ogni volta che viene creata una nuova istanza di una classe viene eseguito il costruttore della classe, che ha lo stesso nome della classe e nessun tipo restituito.

public:
    StringComponent() {

Nella stringa riportata di seguito è illustrato il metodo GetString, che accetta un valore integer e restituisce una stringa:

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

L'istruzione throw utilizzata nel metodo GetString evidenzia la gestione delle eccezioni basata su runtime:

throw new IndexOutOfRangeException();

Questa istruzione consente di creare un nuovo oggetto di tipo IndexOutOfRangeException e di generare un'eccezione che viene rilevata dal chiamante. La gestione delle eccezioni .NET richiede che tutte le eccezioni, incluse quelle definite per uso personale, siano derivate da System::Exception.

**Nota   **Questo meccanismo di gestione degli errori sostituisce quello utilizzato nella precedente versione di COM, basato su hResult.

Infine, viene creata la proprietà Count di sola lettura:

__property int get_Count { return StringsSet->Count; }

La creazione del nuovo componente con le estensioni gestite per C++ è un'operazione un po' più complessa:

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

Come nell'esempio del programma Hello World con le estensioni gestite per C++, è necessario specificare l'opzione /crl per indicare al compilatore che deve essere creato un assembly in codice gestito .NET.

Per la compilazione dei componenti di esempio relativi a questa esercitazione viene utilizzata per comodità una sottodirectory ..\Bin con percorso relativo rispetto al codice sorgente. Per la compilazione del componente nella giusta posizione specificare il nome qualificato del file utilizzando il parametro /out. In caso di necessità di utilizzo con altri programmi sarebbe possibile porre i componenti compilati nella cache assembly. Nel caso si specifichi un file di output con estensione DLL è necessario inserire l'opzione -dll per creare un file DLL e non un file eseguibile con estensione DLL.

Vedere anche

Un componente in Visual C# | Un componente in Visual Basic | Client per i componenti semplici | Riepilogo dell'esercitazione di sviluppo | Appendice A: strumenti per l'esplorazione degli spazi dei nomi