Ошибка System.EntryPointNotFoundException: Mono_Posix_Stdlib_free C# Mono

126
14 апреля 2019, 20:50

Пытаюсь работать с шиной i2c на Raspberry Pi. Нашел обертку для использования. При запуске вылетает ошибка System.EntryPointNotFoundException: Mono_Posix_Stdlib_free C# Mono. Обертка по ссылке i2c wrapper

  using Mono.Unix.Native;
  using Mono.Unix;
  [DllImport("libc.so.6", EntryPoint = "ioctl", SetLastError = true)]
    extern private static int ioctl(int fd, int request, byte x);
  byte[] bytes;
        using (var i2cBus = new I2CBus(bus))
        {
            var i2cDevice = new I2CDevice(i2cBus, 0x22);
            log.Debug($"{i2cDevice.ToString()} Device");
            System.Console.WriteLine($"{i2cDevice.Address} address");
            log.Debug($"{i2cDevice.Address} address");
            System.Console.WriteLine($"{i2cDevice.ReadByte(0x00)} Data");
            log.Debug($"{i2cDevice.ReadByte(0x00)} Data");
        }

Как только происходит вызов ReadByte (или любой другой метод из библиотеки) вываливается эта ошибка. Вот метод чтения байт из библиотеки

 public unsafe byte ReadBytes(byte devAddr, byte regAddr, byte length, byte[] data, int offset=0, ushort timeout = 0)
    {
        if (length > 127)
            throw new IOException(_device + ": length > 127");
        //TODO: break this up so that we can await on all 3  native calls
        ChangeDevice(devAddr);
        //fixed(byte* p = &regAddr)
        {
            int ret = (int)Syscall.write(_fd, &regAddr, 1);
            if (ret != 1)
            {
                CheckAndThrowUnixIOException();
            }
        }
        int count;
        fixed (byte* p = &data[offset])
        {
            count = (int)Syscall.read(_fd, p, (ulong)length);
            if (count < 0)
            {
                CheckAndThrowUnixIOException();
            }
            else if (count != length)
            {
                throw new IOException(_device + ": read short: length = " + length + " > " + count);
            }
        }
        return (byte)count;
    }

Попробовал скопировать библиотеку которая создается при билде (Mono.Posix.dll) и заменил в папке /usr/lib/mono/4.0-api / Не помогло. Куда дальше смотреть?

Answer 1

Ошибка ушла после даунгрейда Mono.Posix с последней стабильной версии 5.х.х до 4.0 Также в коде необходимо установить адрес по которому происходит обращение к I2C шине в самом ядре(насколько я правильно понял копаясь в исходниках i2c-dev, ioctl Mono.Posix и тд)

public const int I2C_SLAVE = 0x0703;

если этот адрес изменить будет ошибка IO. Я перепутал адрес с адресом самого подключаемого устройства(чипа). Все запустилось и удалось теперь работать с шиной.

READ ALSO
Как сделать копирование и вставку строк таблицы для дерева?

Как сделать копирование и вставку строк таблицы для дерева?

Имеется таблица базы данныхНа основании таблицы формируется дерево

171
Не загружается картинка с помощью CostaRico/yii2-images

Не загружается картинка с помощью CostaRico/yii2-images

использую CostaRico/yii2-images для вывода изображение записи из бд, но метод getUrl создает странную ссылку в итоге ссылка не существует в чем может быть...

151
Отправить запрос на ip через curl

Отправить запрос на ip через curl

Пробую отправить запрос на ip нужного сайта через curlВначале отправил через постман такой запрос:

191
Можно ли как-то быстро включить / отключить xdebug? Без изменения php.ini и перезагрузки сервера?

Можно ли как-то быстро включить / отключить xdebug? Без изменения php.ini и перезагрузки сервера?

Страницы моего сайта без xdebug грузятя за несколько миллисекунд, а с xdebug за 5 секунд - минимумА бывает и дольше

164