Я опытный инженер-программист, но немного новичок в C #.У меня есть DLL, которая состоит из объектов C ++ с интерфейсом C, как показано на рисунке.Я использовал этот интерфейс C, потому что я не был уверен, есть ли способ получить доступ к точкам входа C ++ в DLL из моего приложения C #.
__declspec(dllexport) void *Constructor();
__declspec(dllexport) void Destructor(void *pObj);
__declspec(dllexport) int Method(void *pObj, char *pSrcDst, int len);
Это код C для вышеуказанного интерфейса.
extern "C" void *Constructor()
{
return (void *)new Object;
}
extern "C" void Destructor(void *pObj)
{
delete (Object *)pObj;
}
extern "C" int Method(void *pObj, char *pSrcDst, int len)
{
if (!pObj) return 0;
return ((Object *)pObj)->Method(pSrcDst, len);
}
Пока все хорошо.Теперь мне нужно иметь доступ к этому интерфейсу из приложения C #.Из того, что я узнал, я реализовал следующий интерфейс C #.
unsafe public class Wrapper
{
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
IntPtr Constructor();
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
void Destructor(IntPtr pObj);
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
int Method(IntPtr pObj, [In,Out] byte[] pSrcDst, int len);
А вот код C #, который использует вышеупомянутый интерфейс.Wrapper.Method, а также Wrapper.Destructor.Я предполагаю, что неправильно обрабатываю указатель на объект.Есть предложения?