Получение AccessViolation Exception при возврате bool из C++ в C#

Я использую стороннюю проприетарную DLL, исходный код которой мне не доступен. Однако код оболочки, который был сгенерирован автоматически с помощью SWIG 1.3.39, доступен для меня. Код оболочки состоит из файла C++, который компилируется (с использованием некоторых заголовков, описывающих DLL) в DLL, и проекта C#, который выполняет вызовы PInvoke к DLL-оболочке C++.

После проверки StackTrace я получил следующую информацию:

at org.doubango.tinyWRAP.tinyWRAPPINVOKE.MediaSessionMgr_consumerSetInt64(HandleRef jarg1, Int32 jarg2, String jarg3, Int64 jarg4)
at Deskcon_ABL.NotificationHandler.sipService_onInviteEvent(Object sender, InviteEventArgs e)
at BogheCore.Events.EventHandlerTrigger.TriggerEvent[T](EventHandler`1 handler, Object source, T args) 
at BogheCore.Services.Impl.SipService.MySipCallback.OnDialogEvent(DialogEvent e)
at org.doubango.tinyWRAP.SipCallback.SwigDirectorOnDialogEvent(IntPtr e) 

Вот код C#:

//in the C# Wrapper

    public bool consumerSetInt64(twrap_media_type_t media, string key, long value) {
    bool ret = tinyWRAPPINVOKE.MediaSessionMgr_consumerSetInt64(swigCPtr, (int)media, key, value);
    return ret;
  }

//In tinyWRAPPINVOKE Class in another file in the C# wrapper:

  [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_consumerSetInt64")]
  public static extern bool MediaSessionMgr_consumerSetInt64(HandleRef jarg1, int jarg2, string jarg3, long jarg4);

И код C++ из оболочки C++:

SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_consumerSetInt64(void * jarg1, int jarg2, char * jarg3, long long jarg4) {
  unsigned int jresult ;
  MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
  twrap_media_type_t arg2 ;
  char *arg3 = (char *) 0 ;
  int64_t arg4 ;
  bool result;

  arg1 = (MediaSessionMgr *)jarg1; 
  arg2 = (twrap_media_type_t)jarg2; 
  arg3 = (char *)jarg3; 
  arg4 = (int64_t)jarg4; 
  result = (bool)(arg1)->consumerSetInt64(arg2,(char const *)arg3,arg4);
  jresult = result; 
  return jresult;
}

1 ответ

Скорее всего, это первый (void *) или третий (char *) параметры в DllImport. Не могли бы вы показать код, где вы создаете и присваиваете то, что вы передаете для обоих?

Вы можете попробовать изменить маршаллинг одного или обоих, возможно, на что-то вроде следующего:

[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_consumerSetInt64")]
public static extern bool MediaSessionMgr_consumerSetInt64(IntPtr jarg1, int jarg2, StringBuilder jarg3, long jarg4);

Но если бы у вас было больше информации о том, для чего используется каждый из этих параметров, это также может помочь определить проблему.

Другие вопросы по тегам