Как передать указатель на объект из и в DLL? - PullRequest
1 голос
/ 16 февраля 2012

Я опытный инженер-программист, но немного новичок в 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.Я предполагаю, что неправильно обрабатываю указатель на объект.Есть предложения?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Наиболее вероятная проблема в том, что ваш код не использует правильное соглашение о вызовах . В C ++ значение по умолчанию __cdecl, но для DllImport значение по умолчанию __stdcall.

Чтобы исправить это, явно указывает соглашение о вызовах :

[DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]
1 голос
/ 16 февраля 2012

У меня сложилось впечатление, что лучший способ сделать это - использовать управляемую оболочку c ++ / CLI.

Создание простой оболочки C ++. Net. Шаг за шагом

и

http://devmaster.net/forums/topic/7357-how-to-build-a-net-wrapper-for-a-c-library/

выглядит многообещающе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...