Итак, у меня есть C ++ API, содержащийся в * .dll, и я хочу использовать приложение C # для вызова методов в API.
До сих пор я создал проект C ++ / CLR, который включает в себяродной C ++ API и ему удалось создать «мостовой» класс, который выглядит примерно так:
// 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);
}
У меня также есть приложение C #, которое имеет ссылкув C ++ / CLR "Bridge.dll", а затем использует методы, содержащиеся в.У меня есть ряд проблем с этим:
- Я не могу понять, как вызвать bridge_test2 в программе на C #, поскольку она не знает, что такое api_struct на самом деле.Я знаю, что мне нужно где-то маршалировать объект, но я делаю это в программе на C # или на мосту C ++ / CLR?
- Это похоже на очень скучный способ разоблачения всех методов в API, разве нет более простого способа, который я упускаю?(Это не использует P / Invoke!)
РЕДАКТИРОВАТЬ: Хорошо, теперь у меня есть основы работы благодаря ответам ниже, однако моя структура (назовите это"api_struct2" для этого примера) имеет как собственный enum, так и объединение в собственном коде C ++, например:
typedef struct
{
enum_type1 eEnumExample;
union
{
long lData;
int iData;
unsigned char ucArray[128];
char *cString;
void *pvoid;
} uData;
} api_struct2;
Я думаю, я понял, как заставить работать enum;Я повторно объявил об этом в управляемом коде и выполняю «native_enum test = static_cast (eEnumExample)», чтобы переключить управляемую версию на собственную.
Однако профсоюз поставил меня в тупик, я не совсем уверен, как на него напасть .. Идеи кого-нибудь?