2008-09-16 14 views

Respuesta

3

Hay un par de rutas que puede ir con esto: una, puede actualizar sus bibliotecas C++ no administradas para tener un contenedor administrado de extensiones C++ y tener C# utilizar esas clases directamente. Esto lleva un poco de tiempo, pero proporciona un buen puente para el código heredado no administrado. Pero tenga en cuenta que las extensiones administradas de C++ a veces son un poco difíciles de navegar, ya que la sintaxis es similar a C++ no administrado, pero lo suficientemente cerca como para que un ojo muy entrenado pueda ver las diferencias.

La otra ruta a seguir es hacer que Cumn implemente implementar clases COM y hacer que C# lo utilice mediante un ensamblado de interoperabilidad autogenerado. De esta forma es más fácil si conoce bien el camino de COM.

Espero que esto ayude.

0

También puede llamar al código no administrado mediante P/Invoke. Esto puede ser más fácil si su código actualmente no usa COM. Supongo que probablemente necesites escribir algunos puntos de exportación específicos en tu código usando enlaces "C" si tomas esta ruta.

Probablemente la cosa más importante que hay que tener en cuenta en mi experiencia es que la falta de recolección determinística de basura significa que tus destructores no se ejecutarán cuando podrías haber pensado que lo harían previamente. Debe tener esto en cuenta y utilizar IDisposable u otro método para asegurarse de que su código administrado se limpia cuando usted lo desea.

1

Usted está describiendo P/Invocar. Eso significa que su biblioteca de C++ tendrá que exponerse a través de una interfaz DLL, y la interfaz deberá ser lo suficientemente simple como para describir a P/Invoke a través de los atributos de la llamada. Cuando el código administrado entra en el mundo no administrado, los parámetros tienen que organizarse, por lo que parece que podría haber un pequeño golpe de rendimiento, pero tendrías que hacer algunas pruebas para ver si el marshalling es significativo o no.

0

Por supuesto, siempre hay PInvoke por ahí si empaqueta su código como archivos DLL con puntos de entrada externos. Ninguna de las opciones es libre de dolor. Dependen de: a) su habilidad para escribir envolturas COM o Managed C b) cambiar su brazo a PInvoke.

1

La manera más fácil de comenzar es asegurarse de que toda la funcionalidad C++ esté expuesta como funciones de estilo 'C'. Asegúrese de declarar la función como _stdcall.

extern "C" __declspec (dllexport) int _stdcall Foo (int a)

Asegúrate de que tienes el derecho de clasificación, sobre todo cosas como punteros & wchar_t *. Si lo haces mal, puede ser difícil depurarlo.

Debug it desde cualquier lado, pero no ambos. Al depurar nativo mixto & administrado, el depurador puede ser muy lento. La depuración de 1 lado a la vez ahorra mucho tiempo.

Obtener más específico requeriría una pregunta más específica.

0

Me gustaría echar un vistazo a swig, lo usamos con buenos resultados en nuestro proyecto para exponer nuestra API de C++ a otras plataformas de idiomas.

Es un proyecto bien mantenido que crea un envoltorio fino alrededor de su biblioteca C++ que permite que idiomas como C# se comuniquen directamente con su código nativo, ahorrándole la molestia de tener que implementar (y depurar) el código de pegamento.

0

Si quieres un buen ejemplo de PInvoke puedes mirar PInvoke.net. Tiene ejemplos de cómo llamar a la mayoría de las funciones de api win.

También puede utilizar la herramienta de este artículo Clr Inside Out: PInvoke que traducirá su archivo .h a envolturas C#.