Pregunta

Me gustaría llamar a mis bibliotecas C++ no administradas desde mi código C#.¿Cuáles son los posibles riesgos y precauciones que deben tomarse?Gracias por tu tiempo.

¿Fue útil?

Solución

Esta pregunta es demasiado amplia.La única respuesta razonable es P/Invoke, pero eso es como decir que si quieres programar para Windows necesitas conocer la API de Win32.

Se han escrito casi libros completos sobre P/Invoke (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X), y por supuesto se han creado sitios web completos: http://www.pinvoke.net/.

Otros consejos

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

La otra ruta a seguir es hacer que su C++ no administrado implemente clases COM y que C# las utilice a través de un ensamblado de interoperabilidad generado automáticamente.De esta manera es más fácil si conoces COM lo suficiente.

Espero que esto ayude.

Estás describiendo P/Invoke.Eso significa que su biblioteca C++ deberá exponerse a través de una interfaz DLL, y la interfaz deberá ser lo suficientemente simple como para describirla en P/Invoke a través de los atributos de llamada.Cuando el código administrado llama al mundo no administrado, los parámetros deben ordenarse, por lo que parece que podría haber un ligero impacto en el rendimiento, pero habría que hacer algunas pruebas para ver si la ordenación es significativa o no.

La forma más sencilla de comenzar es asegurarse de que todas las funciones de C++ estén expuestas como funciones de estilo 'C'.Asegúrese de declarar la función como _stdcall.

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

Asegúrese de realizar la clasificación correcta, especialmente cosas como punteros y wchar_t *.Si lo hace mal, puede resultar difícil depurarlo.

Depurarlo desde cualquier lado, pero no desde ambos.Al depurar una mezcla nativa y administrada, el depurador puede volverse muy lento.Depurar un lado a la vez ahorra mucho tiempo.

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

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

Probablemente, según mi experiencia, lo más importante a tener en cuenta es que la falta de recolección de basura determinista significa que sus destructores no se ejecutarán cuando pensaba que lo harían anteriormente.Debe tener esto en cuenta y utilizar IDisposable o algún otro método para asegurarse de que su código administrado se limpie cuando lo desee.

Por supuesto, siempre existe PInvoke también si empaquetó su código como archivos DLL con puntos de entrada externos.Ninguna de las opciones es indolora.Dependen de a) su habilidad para escribir envoltorios COM o C administrado b) cambiar su brazo en PInvoke.

yo echaría un vistazo a trago, usamos esto con buenos resultados en nuestro proyecto para exponer nuestra API de C++ a otras plataformas de lenguaje.

Es un proyecto bien mantenido que construye efectivamente un contenedor delgado alrededor de su biblioteca C++ que puede permitir que lenguajes como C# se comuniquen directamente con su código nativo, ahorrándole la molestia de tener que implementar (y depurar) código adhesivo.

Si desea buenos ejemplos de PInvoke, puede consultar PInvoke.net.Tiene ejemplos de cómo llamar a la mayoría de las funciones de Win API.

También puedes usar la herramienta de este artículo. Limpiar de adentro hacia afuera:PInvocar eso traducirá su archivo .h a contenedores de C#.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top