2009-02-20 16 views
42

Tengo un C++ no administrado DLL que exporta más que una sola clase (no COM ... es sólo un simple clase de C++) como su interfaz. Quiero usar esta clase en C#, pero me dicen que no se puede importar simplemente en C#.clase de C++ DLL en C# Aplicación

¿Cuál es la forma correcta de utilizar esta clase en mi aplicación C#?

+1

¿Es una clase COM? –

+1

Lo siento, debería haber sido más específico. Esta NO es una clase COM. Es solo una vieja clase de C++. – cjserio

Respuesta

43

Una manera sencilla de clase asumiendo Foo:

  1. Crear un proyecto de C++/CLI, llaman a esta FooWrapper.
  2. Haga que FooWrapper dependa del dll no administrado (como lo haría normalmente).
  3. Crea una clase gestionada ManagedFoo que contiene un único campo de instancia privada de tipo Foo *.
  4. proporcionan funciones de envoltura pública en ManagedFoo que se envían al campo de instancia subyacente.
  5. Opcionalmente (aunque se recomienda):
    • parámetros convertir de expresiones idiomáticas .net (cadenas y similares) a los modismos C++ (std :: string o char *)
    • captura excepciones no administrados y tirar los administrados en lugar

a continuación, hacer que el código C# depende de la FooWrapper proyecto/DLL y asegurar que el ll no administrado se implementa correctamente con él, cómo se hace eso depende de la DLL no administrado, pero en el mismo directorio que normalmente es suficiente .

Si las funciones no dependen de las instancias de la clase, entonces es aún más simple P/Invoke

+0

No llamaría (5) opcional si el OP trata con cadenas o excepciones, sin embargo. –

+0

¿Qué haría si quisiera deshacerme de la capa C++ Dll y simplemente crear un proyecto C++/CLI que sea tanto el DLL como el contenedor en uno? Más específicamente, mi DLL C++ actual simplemente vincula un conjunto de bibliotecas estáticas en una interfaz agradable. ¿Puedo hacer todo este trabajo en un proyecto de C++/CLI? – cjserio

+0

Sí, puedes hacer todo en este C++/CLI – ShuggyCoUk

2

Hace falta un proxy (patrón de GoF) intermediario para tender un puente sobre el límite administrado/gestionado.

dos opciones:

  • A C++/CLI envoltura
  • Un contenedor COM.

El primero será más directo, y este último tiene dos pasos puro C++ -> COM -> .NET.

+0

podría proporcionar algunos enlaces/información para la segunda opción. Gracias – rsjethani

+0

@rsjethani: No tengo ninguno a mano: crear un contenedor COM significa escribir COM (nativo). Luego, usa 'implib' para crear el contenedor para .NET. – Richard

8

Esta respuesta podría ser excesiva para una sola biblioteca de clases, pero TRAGO es una buena solución para ++/clases de "envoltura" C C para el uso de otros idiomas. Funciona bien con C#.

Verhttp://www.swig.org/.

3

DllImport es su mejor apuesta. Hay un poco de masaje de tipo de datos, especialmente si está pasando estructuras, pero puede hacer casi cualquier cosa con él.

2

A veces, es más fácil de proporcionar su propia interfaz C. SWIG no es trivial de configurar. He usado C++ administrado y C++/CLI y están bien. Lo más fácil fue simplemente hacer un contenedor C (y puede ser usado por cualquier otro lenguaje ya que la mayoría tiene una forma de llamar a una función C).