visual sharp programaciĆ³n lenguaje entre diferencia c# c++ import header .lib

sharp - lenguaje c#



Importar un archivo.lib y.h de C++ en un proyecto de C#? (3)

Acabo de comenzar un proyecto de C # y quiero importar un archivo C ++ .lib y su correspondiente encabezado (.h).

He leído varios mensajes que todos mencionan .dll, en lugar de .lib, lo que me confunde.

La imagen de abajo muestra los archivos .lib y .h a los que me refiero, todo lo que he hecho es arrastrarlos al proyecto.

¿Puede alguien indicarme una explicación más clara de cómo hacer esto? Estoy seguro de que no puede ser tan difícil como parece.


Esto es, desafortunadamente, un problema no trivial.

La razón se debe principalmente al hecho de que C++ es un lenguaje no administrado . C# es un lenguaje gestionado . Administrado y no administrado se refiere a cómo un lenguaje administra la memoria.

  • C++ debes hacer tu propia gestión de memoria (asignando y liberando),
  • C# .NET Framework realiza la administración de memoria con un recolector de basura .

En tu código de biblioteca

Debes asegurarte de que todos los lugares a los que llamas new , los que debes llamar delete , y lo mismo vale para malloc y free si estás usando las convenciones de C

Tendrá que crear un montón de clases envolventes alrededor de sus llamadas a funciones, y asegurarse de que no está perdiendo ninguna memoria en su código C++ .

El problema

Su principal problema (que yo sepa) es que no podrá llamar esas funciones directamente en C# porque no puede vincular estáticamente el código no administrado al código administrado .

Tendrá que escribir un .dll para envolver todas las funciones de su biblioteca en C++ . Una vez que lo haga, puede usar la funcionalidad de interoperabilidad de C# para llamar a esas funciones desde la dll.

[DllImport("your_functions.dll", CharSet = CharSet.Auto)] public extern void your_function();


Es ''tan difícil como parece''. C ++ y C # son ambivalentes. El primero tiene destrucción determinista, el segundo no. Ahora, escribe C ++ / cli retrasando la destrucción de algún finalizador llamado por el recolector de basura que trabaja en su propio hilo, introduciendo problemas en todo el lugar (seguridad del hilo, ¿son miembros de C ++ (utilizados en c ++ / cli) válidos? ). Peor aún, el GC podría sugerir que los objetos C ++ sean pequeños (un puntero) y provoquen una especie de pérdida de memoria (debido a la desasignación tardía de objetos pequeños). Esencialmente, terminas escribiendo un GC encima del C ++ / cli GC para eliminar objetos que no sean C ++ / cli (!) En el hilo principal u otro. Todo eso es una locura, ...


Lo que podría hacer es crear un contenedor C ++ / CLI y exponer la funcionalidad de la biblioteca que desea usar a través de su contenedor. El contenedor creado dll que puede hacer referencia fácilmente en su proyecto de C #. Por supuesto, esto requiere un poco de trabajo para crear el contenedor administrado / no administrado, pero a la larga se verá recompensado.

Para crear un proyecto de C ++ administrado, seleccione bajo las plantillas de proyecto C ++ CLR y Class Library. Aquí puede vincular a su biblioteca, use el archivo de encabezado de la forma en que está acostumbrado.

A continuación, crea una nueva clase (ref class) y envuelve tu biblioteca en ella. Un ejemplo podría parecer algo como esto:

LibHeader.h int foo(...);

Escribe una clase de envoltura como esta: Encabezado:

Wrapper.h public ref class MyWrapper { public: int fooWrapped(); };

Su implementación:

Wrapper.cpp #include Libheader.h int MyWrapper::fooWrapped() { return foo(); }

Los espacios de nombres y todas las cosas buenas omitidas por simplicidad. Ahora puede usar MyWrapper en su código C # tan fácil como cualquier otra clase administrada. Por supuesto, cuando la interfaz de la biblioteca se vuelve más complicada, hay que pensar un poco más, pero podría ayudar a separar el código lib de su aplicación. Espero haber arrojado algo de luz sobre él.