Entonces, lo que tengo es una API C++ contenida dentro de * .dll y quiero usar una aplicación C# para llamar a métodos dentro de la API.Exponer una API de C++ a C#
Hasta ahora han creado un proyecto/CLR C++ que incluye el C++ nativo API y logrado crear una clase de "puente" que se ve un poco como el siguiente:
// ManagedBridge.h
#include <CoreAPI.h>
using namespace __CORE_API;
namespace ManagedAPIWrapper
{
public ref class Bridge
{
public:
int bridge_test(void);
int bridge_test2(api_struct* temp);
}
}
.
// ManagedBridge.cpp
#include <ManagedBridge.h>
int Bridge::bridge_test(void)
{
return test();
}
int Bridge::bridge_test2(api_struct* temp)
{
return test2(temp);
}
I también tienen una aplicación # C que tiene una referencia a la C++/CLR "bridge.dll" y luego utiliza los métodos contenidos dentro. Tengo una serie de problemas con esto:
- no puedo encontrar la manera de llamar bridge_test2 dentro del programa de C#, ya que no tiene conocimiento de lo que es un api_struct realmente es. Sé que tengo que ordenar el objeto en algún lugar, pero ¿lo hago en el programa C# o en el puente C++/CLR?
- Esto parece un muy manera prolija de exponer todos los métodos en la API, ¿no hay una manera más fácil de que me esté perdiendo? (Que no utiliza P/Invoke!)
EDIT: Ok, así que tengo los conceptos básicos de trabajo ahora gracias a las respuestas a continuación, sin embargo, mi estructura (lo llaman "api_struct2" para este ejemplo) tiene tanto una enumeración nativa y la unión en el código C++ nativo, como el siguiente:
typedef struct
{
enum_type1 eEnumExample;
union
{
long lData;
int iData;
unsigned char ucArray[128];
char *cString;
void *pvoid;
} uData;
} api_struct2;
Creo que he encontrado la manera de conseguir el funcionamiento de enumeración; Lo he vuelto a declarar en el código administrado y estoy realizando un "test nativo_entero = static_cast (eEnumExample)" para cambiar la versión administrada a original.
Sin embargo, la unión me tiene perplejo, no estoy seguro de cómo atacarlo ... ¿Alguien tiene ideas?
¿Significaría esto que creo el managed_api_struct en C++/CLI * .dll o en el código C# mismo? Además, pensé que podría pasar una estructura administrada al código nativo siempre que utilizara el atributo StructLayout. – Siyfion
No importa, pero C++/CLI tiene sentido para evitar dependencias circulares. Sí, [StructLayout] funciona pero usted * debe * utilizar una llamada Marshal :: StructureToPtr(). El diseño de una estructura administrada no es predecible. –
Ok, gracias, voy a dar una oportunidad ahora, veo dónde me encuentro. – Siyfion