Compartir a través de


Un componente en Extensiones administradas de C++

Ésta es la apariencia que tiene el componente de cadena simple en Extensiones administradas de C++:

Lista 1. Componente en Extensiones administradas de 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; }
      };

};

Tal y como se ha mencionado anteriormente, se utiliza la instrucción namespace para crear un nuevo espacio de nombres con el fin de encapsular las clases que se vayan a crear:

namespace CompVC {

Observe que este espacio de nombres puede estar anidado y puede dividirse entre varios archivos. Un sólo archivo de código fuente también puede contener varios espacios de nombres no anidados. Como el espacio de nombres puede contener clases administradas y no administradas (a diferencia de los espacios de nombres en Visual Basic y Visual C#, que sólo tienen clases administradas), se utiliza el modificador __gc para especificar que la clase StringComponent está administrada:

__gc public class StringComponent {

Esta instrucción significa que ahora Common Language Runtime va a crear instancias de StringComponent, que serán administradas en el montón de la recolección de elementos no utilizados. También se puede utilizar el modificador de compilación /clr para convertir todas las clases del programa en clases administradas, tengan o no el prefijo __gc.

El constructor de clases, que se ejecuta cada vez que se crea una nueva instancia de la clase, tiene el mismo nombre que la clase y no tiene ningún tipo de valor devuelto.

public:
    StringComponent() {

Éste es el método GetString, que utiliza un entero y devuelve una cadena:

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

La instrucción throw en el método GetString resalta el control de excepciones basado en el tiempo de ejecución:

throw new IndexOutOfRangeException();

Esta instrucción crea un nuevo objeto del tipo IndexOutOfRangeException e inicia una excepción, que detecta el llamador. Observe que el control de excepciones de .NET requiere que todas las excepciones, incluidas aquéllas que se definen para uso propio, se deriven de System::Exception.

**Nota   **Este mecanismo de control de errores reemplaza otro basado en hResult que se utilizaba en las versiones anteriores de COM.

Por último, se crea la propiedad Count de sólo lectura:

__property int get_Count { return StringsSet->Count; }

La generación del nuevo componente de Extensiones administradas de C++ es un poco más complicada:

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

Al igual que en el caso del sencillo ejemplo de Hola a todos en Extensiones administradas de C++, se necesita el modificador /clr para indicar al compilador que cree un ensamblado de código administrado de .NET.

Por comodidad, los componentes de ejemplo en este tutorial se mantienen en un subdirectorio ..\Bin relativo al código fuente. Para compilar el componente en dicha ubicación, sólo se ha de especificar el nombre de archivo completo mediante el parámetro /out. También se podrán colocar los componentes compilados en la caché de ensamblados si se van a utilizar con otros programas. Incluso si se ha especificado un archivo de resultados con la extensión de nombre de archivo.dll, se necesita el modificador -dll adicional para crear un archivo DLL en lugar de un archivo ejecutable con la extensión de nombre de archivo.dll.

Vea también

Un componente en Visual C# | Un componente en Visual Basic | Clientes para los componentes simples | Resumen del tutorial sobre la programación | Apéndice A: Herramientas para explorar espacios de nombres