У меня следующий код 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.'
Я искал вокруг, чтобы увидеть, что можетбыть причиной, но не нашел никакой соответствующей информации.
Некоторые мысли:
- Когда я выполняю ptr.ReadByte (), который не завершается ошибкой, но считываемый им байт имеет значение0 для каждого байта, который он читает
- Это заставляет меня думать, что если это возможно, то компилятор перенаправил память, чтобы сделать что-то еще (или просто освободил объект)
- Кроме того, так как C ++функция уже вернулась, не должна ли она быть выпущена из стека?Если да, то как будет работать вызов P / на основе указателей?
Если нет, то что может вызвать сбой в моем коде?Я что-то упустил?