Quindi quello che ho è una API C++ contenuta in un file * .dll e voglio usare un'applicazione C# per chiamare metodi all'interno dell'API.Esporre un'API C++ a C#
Finora ho creato un progetto/CLR C++ che include il C++ native API ed è riuscito a creare una classe "ponte" che sembra un po 'come il seguente:
// 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);
}
devo anche un'applicazione C# che ha un riferimento al C++/CLR "Bridge.dll" e quindi utilizza i metodi contenuti all'interno. Ho un certo numero di problemi con questo:
- io non riesco a capire come chiamare bridge_test2 all'interno del programma C#, in quanto non è a conoscenza di ciò che un api_struct è in realtà. So che ho bisogno di eseguire il marshalling dell'oggetto da qualche parte, ma lo faccio nel programma C# o nel bridge C++/CLR?
- Questo mi sembra molto modo prolisso di esporre tutti i metodi nell'API, non c'è forse un modo più semplice che mi manca fuori? (Che non utilizza P/Invoke!)
EDIT: Ok, così ho le basi di lavoro ora, grazie alle risposte di seguito, tuttavia il mio struct (chiamarla "api_struct2" per questo esempio) ha sia un enum nativo e l'unione nel codice C++ nativo, come il seguente:
typedef struct
{
enum_type1 eEnumExample;
union
{
long lData;
int iData;
unsigned char ucArray[128];
char *cString;
void *pvoid;
} uData;
} api_struct2;
mi pare di aver capito come ottenere il lavoro enum; L'ho re-dichiarato nel codice gestito e sto eseguendo un "native_enum test = static_cast (eEnumExample)" per convertire la versione gestita in nativa.
Tuttavia il sindacato mi ha messo perplesso, non sono proprio sicuro di come attaccarlo .. Idee qualcuno?
Quindi, questo significherebbe che creo il managed_api_struct nel C++/CLI * .dll o nel codice C# stesso? Inoltre, ho pensato che si potesse passare una struct gestita al codice nativo fino a quando si è utilizzato l'attributo StructLayout? – Siyfion
Non importa, ma C++/CLI ha senso evitare le dipendenze circolari. Sì, [StructLayout] funziona ma tu * devi * utilizzare una chiamata Marshal :: StructureToPtr(). Il layout di una struttura gestita non è prevedibile. –
Ok grazie, darò un'occhiata ora, vedere dove mi prendo anche io. – Siyfion