Попытка получить int [] из c ++ в C # терпит неудачу, в то время как Marshalling - PullRequest
0 голосов
/ 17 мая 2019

У меня следующий код C ++.

exten "C" int * read_array_adapter() {  

      int * retval =  read_array().data();
      return retval;
}

И следующий код C # P / Invoke layer

[DllImport(@"/sharedlibrary.so",CallingConvention = CallingConvention.Cdecl)]                                
 public extern static IntPtr read_array_adapter();

Это хорошо связывает.Теперь во время выполнения у меня есть следующий код, вызывающий метод:

  var ptr = read_array_adapter();  

  var arrayLength = Marshal.ReadInt32(ptr);

Сбой со следующей ошибкой:

An unhandled exception of type 'System.AccessViolationException' occurred in System.Private.CoreLib.dll: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'

Я искал вокруг, чтобы увидеть, что можетбыть причиной, но не нашел никакой соответствующей информации.

Некоторые мысли:

  1. Когда я выполняю ptr.ReadByte (), который не завершается ошибкой, но считываемый им байт имеет значение0 для каждого байта, который он читает
  2. Это заставляет меня думать, что если это возможно, то компилятор перенаправил память, чтобы сделать что-то еще (или просто освободил объект)
  3. Кроме того, так как C ++функция уже вернулась, не должна ли она быть выпущена из стека?Если да, то как будет работать вызов P / на основе указателей?

Если нет, то что может вызвать сбой в моем коде?Я что-то упустил?

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