Cómo: Expone un contenedor de STL/CLR de un ensamblado

Los contenedores de STL/CLR como list y map se implementan como clases de referencia de la plantilla.Dado que las plantillas de C++ se crean instancias en tiempo de compilación, dos clases de plantilla que tienen exactamente la misma firma pero están en distintos ensamblados son realmente tipos diferentes.Esto significa que las clases de plantilla no se pueden utilizar en los límites del ensamblado.

Para crear compartir de entre ensamblados posible, implemente de contenedores de STL/CLR la interfaz genérica ICollection<T>.Con esta interfaz genérica, todos los lenguajes que genéricos compatible con, como C++, C#, y Visual Basic, pueden tener acceso a los contenedores de STL/CLR.

En este tema se muestra cómo mostrar los elementos de varios contenedores de STL/CLR escritos en C++. StlClrClassLibrarydenominado ensamblado.Se muestran dos ensamblados para tener acceso a StlClrClassLibrary.Escriba el primer ensamblado en C++, y el segundo en C#.

Si escriben ambos ensamblados en C++, puede tener acceso a la interfaz genérica de un contenedor mediante la definición de generic_container .Por ejemplo, si tiene un contenedor de cliext::vector<int>tipo, su interfaz genérica es: cliext::vector<int>::generic_container.De igual forma, puede obtener un iterador sobre la interfaz genérica utilizando typedef de generic_iterator , como en: cliext::vector<int>::generic_iterator.

Puesto que estos typedefs se declaran en los archivos de encabezado de C++, ensamblados escritos en otros lenguajes no pueden utilizarlos.Por consiguiente, tener acceso a la interfaz genérica para cliext::vector<int> en C# o cualquier otro lenguaje.NET, utilice System.Collections.Generic.ICollection<int>.Para iterar sobre esta colección, utilice un bucle de foreach .

La tabla siguiente muestra la interfaz genérica que cada contenedor de STL/CLR implementa:

Contenedor de STL/CLR

Interfaz genérica

deque<t>

ICollection<t>

hash_map<K, V>

IDictionary<K, V>

hash_multimap<K, V>

IDictionary<K, V>

hash_multiset<t>

ICollection<t>

hash_set<t>

ICollection<t>

lista<t>

ICollection<t>

mapa<K, V>

IDictionary<K, V>

multimap<K, V>

IDictionary<K, V>

conjunto múltiple<t>

ICollection<t>

establezca<t>

ICollection<t>

vector<t>

ICollection<t>

[!NOTA]

Dado que queue, priority_queue, y los contenedores de stack no admiten iteradores, no implementan interfaces genéricas y no pueden ser entre ensamblados acceso.

Ejemplo 1

Bb385659.collapse_all(es-es,VS.110).gifDescripción

En este ejemplo, declaramos la clase en cuestión. que contiene datos privados del miembro de STL/CLR.A continuación declaramos métodos públicos para conceder acceso a colecciones privados de la clase.La hace de dos maneras diferentes, una para los clientes de C++ y otra para otros clientes.NET.

Bb385659.collapse_all(es-es,VS.110).gifCódigo

// StlClrClassLibrary.h
#pragma once

#include <cliext/deque>
#include <cliext/list>
#include <cliext/map>
#include <cliext/set>
#include <cliext/stack>
#include <cliext/vector>

using namespace System;
using namespace System::Collections::Generic;
using namespace cliext;

namespace StlClrClassLibrary {

    public ref class StlClrClass
    {
    public:
        StlClrClass();

        // These methods can be called by a C++ class
        // in another assembly to get access to the
        // private STL/CLR types defined below.
        deque<wchar_t>::generic_container ^GetDequeCpp();
        list<float>::generic_container ^GetListCpp();
        map<int, String ^>::generic_container ^GetMapCpp();
        set<double>::generic_container ^GetSetCpp();
        vector<int>::generic_container ^GetVectorCpp();

        // These methods can be called by a non-C++ class
        // in another assembly to get access to the
        // private STL/CLR types defined below.
        ICollection<wchar_t> ^GetDequeCs();
        ICollection<float> ^GetListCs();
        IDictionary<int, String ^> ^GetMapCs();
        ICollection<double> ^GetSetCs();
        ICollection<int> ^GetVectorCs();

    private:
        deque<wchar_t> ^aDeque;
        list<float> ^aList;
        map<int, String ^> ^aMap;
        set<double> ^aSet;
        vector<int> ^aVector;
    };
}

Ejemplo 2

Bb385659.collapse_all(es-es,VS.110).gifDescripción

En este ejemplo, implementamos la clase declarada en el ejemplo 1.Para que los clientes utilicen la biblioteca de clases, se usa la herramienta manifiesto mt.exe para incrustar el archivo de manifiesto en un archivo DLL.Para obtener información detallada, vea los comentarios del código.

Para obtener más información sobre la herramienta y los ensamblados en paralelo de manifiesto, vea Compilar aplicaciones aisladas y ensamblados simultáneos de C/C++.

Bb385659.collapse_all(es-es,VS.110).gifCódigo

// StlClrClassLibrary.cpp
// compile with: /clr /LD /link /manifest
// post-build command: (attrib -r StlClrClassLibrary.dll & mt /manifest StlClrClassLibrary.dll.manifest /outputresource:StlClrClassLibrary.dll;#2 & attrib +r StlClrClassLibrary.dll)

#include "StlClrClassLibrary.h"

namespace StlClrClassLibrary
{
    StlClrClass::StlClrClass()
    {
        aDeque = gcnew deque<wchar_t>();
        aDeque->push_back(L'a');
        aDeque->push_back(L'b');

        aList = gcnew list<float>();
        aList->push_back(3.14159f);
        aList->push_back(2.71828f);

        aMap = gcnew map<int, String ^>();
        aMap[0] = "Hello";
        aMap[1] = "World";

        aSet = gcnew set<double>();
        aSet->insert(3.14159);
        aSet->insert(2.71828);

        aVector = gcnew vector<int>();
        aVector->push_back(10);
        aVector->push_back(20);
    }

    deque<wchar_t>::generic_container ^StlClrClass::GetDequeCpp()
    {
        return aDeque;
    }

    list<float>::generic_container ^StlClrClass::GetListCpp()
    {
        return aList;
    }

    map<int, String ^>::generic_container ^StlClrClass::GetMapCpp()
    {
        return aMap;
    }

    set<double>::generic_container ^StlClrClass::GetSetCpp()
    {
        return aSet;
    }

    vector<int>::generic_container ^StlClrClass::GetVectorCpp()
    {
        return aVector;
    }

    ICollection<wchar_t> ^StlClrClass::GetDequeCs()
    {
        return aDeque;
    }

    ICollection<float> ^StlClrClass::GetListCs()
    {
        return aList;
    }

    IDictionary<int, String ^> ^StlClrClass::GetMapCs()
    {
        return aMap;
    }

    ICollection<double> ^StlClrClass::GetSetCs()
    {
        return aSet;
    }

    ICollection<int> ^StlClrClass::GetVectorCs()
    {
        return aVector;
    }
}

Ejemplo 3

Bb385659.collapse_all(es-es,VS.110).gifDescripción

En este ejemplo, creamos al cliente en cuestión. que usa la biblioteca de clases creada en los ejemplos 1 y 2.Este cliente utiliza tipos de generic_container de contenedores de STL/CLR para iterar sobre los contenedores y mostrar su contenido.

Bb385659.collapse_all(es-es,VS.110).gifCódigo

// CppConsoleApp.cpp
// compile with: /clr /FUStlClrClassLibrary.dll

#include <cliext/deque>
#include <cliext/list>
#include <cliext/map>
#include <cliext/set>
#include <cliext/vector>

using namespace System;
using namespace StlClrClassLibrary;
using namespace cliext;

int main(array<System::String ^> ^args)
{
    StlClrClass theClass;

    Console::WriteLine("cliext::deque contents:");
    deque<wchar_t>::generic_container ^aDeque = theClass.GetDequeCpp();
    for each (wchar_t wc in aDeque)
    {
        Console::WriteLine(wc);
    }
    Console::WriteLine();

    Console::WriteLine("cliext::list contents:");
    list<float>::generic_container ^aList = theClass.GetListCpp();
    for each (float f in aList)
    {
        Console::WriteLine(f);
    }
    Console::WriteLine();

    Console::WriteLine("cliext::map contents:");
    map<int, String ^>::generic_container ^aMap = theClass.GetMapCpp();
    for each (map<int, String ^>::value_type rp in aMap)
    {
        Console::WriteLine("{0} {1}", rp->first, rp->second);
    }
    Console::WriteLine();

    Console::WriteLine("cliext::set contents:");
    set<double>::generic_container ^aSet = theClass.GetSetCpp();
    for each (double d in aSet)
    {
        Console::WriteLine(d);
    }
    Console::WriteLine();

    Console::WriteLine("cliext::vector contents:");
    vector<int>::generic_container ^aVector = theClass.GetVectorCpp();
    for each (int i in aVector)
    {
        Console::WriteLine(i);
    }
    Console::WriteLine();

    return 0;
}

Bb385659.collapse_all(es-es,VS.110).gifOutput

cliext::deque contents:
a
b

cliext::list contents:
3.14159
2.71828

cliext::map contents:
0 Hello
1 World

cliext::set contents:
2.71828
3.14159

cliext::vector contents:
10
20

Ejemplo 4

Bb385659.collapse_all(es-es,VS.110).gifDescripción

En este ejemplo, creamos un cliente de C# que usa la biblioteca de clases creada en los ejemplos 1 y 2.Este cliente utiliza los métodos de ICollection<T> de contenedores de STL/CLR para iterar sobre los contenedores y mostrar su contenido.

Bb385659.collapse_all(es-es,VS.110).gifCódigo

// CsConsoleApp.cs
// compile with: /r:Microsoft.VisualC.STLCLR.dll /r:StlClrClassLibrary.dll /r:System.dll

using System;
using System.Collections.Generic;
using StlClrClassLibrary;
using cliext;

namespace CsConsoleApp
{
    class Program
    {
        static int Main(string[] args)
        {
            StlClrClass theClass = new StlClrClass();

            Console.WriteLine("cliext::deque contents:");
            ICollection<char> iCollChar = theClass.GetDequeCs();
            foreach (char c in iCollChar)
            {
                Console.WriteLine(c);
            }
            Console.WriteLine();

            Console.WriteLine("cliext::list contents:");
            ICollection<float> iCollFloat = theClass.GetListCs();
            foreach (float f in iCollFloat)
            {
                Console.WriteLine(f);
            }
            Console.WriteLine();

            Console.WriteLine("cliext::map contents:");
            IDictionary<int, string> iDict = theClass.GetMapCs();
            foreach (KeyValuePair<int, string> kvp in iDict)
            {
                Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
            }
            Console.WriteLine();

            Console.WriteLine("cliext::set contents:");
            ICollection<double> iCollDouble = theClass.GetSetCs();
            foreach (double d in iCollDouble)
            {
                Console.WriteLine(d);
            }
            Console.WriteLine();

            Console.WriteLine("cliext::vector contents:");
            ICollection<int> iCollInt = theClass.GetVectorCs();
            foreach (int i in iCollInt)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine();

            return 0;
        }
    }
}

Bb385659.collapse_all(es-es,VS.110).gifOutput

cliext::deque contents:
a
b

cliext::list contents:
3.14159
2.71828

cliext::map contents:
0 Hello
1 World

cliext::set contents:
2.71828
3.14159

cliext::vector contents:
10
20

Vea también

Otros recursos

Referencia de la biblioteca de STL/CLR