mono on raspberry pi создает исключение DLLNotFoundException в DLLImport файла общего объекта (.so)

В настоящее время я работаю с моно во время исполнения на Raspberry Pi (B). Я использую Visual Studio Express 2012 для Windows Desktop. Чего я в основном хочу добиться, так это сохранить серию снимков с веб-камеры (Logitech C270) в файл.jpg.

Я нашел проект, который, кажется, делает именно то, что мне нужно: http://www.raspberry-sharp.org/romain-flechner/2012/10/projects/use-a-webcam-plugged-in-a-raspberry-pi-with-mono-in-c-using-raspberrycam/ Итак, я установил его через NuGet в свой проект и скопировал пример кода:

Cameras cameras = Cameras.DeclareDevice()
.Named(“Camera 1″).WithDevicePath(“/dev/video0″)
.Memorize();

cameras.Get(“Camera 1″).SavePicture(new PictureSize(640, 480), “/var/www/test.jpg”, 20);

Как написано в инструкциях на странице проекта, я скопировал RaspberryCam.so в каталог / lib (я также скопировал его в /Lib). Затем я загрузил встроенные файлы (my.exe, RaspberryCam.dll) в Raspberry PI.

Теперь вот моя проблема: всякий раз, когда я пытаюсь выполнить мою программу с моно, я получаю DllNotFoundException для RaspberryCam.so.

Я добавил свой путь к проекту в /etc/ld.so.conf и запустил ldconfig, но это не помогает.

Я также попытался запустить моно в режиме отладки (MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono /var/www/my.exe), и, похоже, он ищет "libRaspberryCam.so", поэтому я скопировал /lib/RaspberryCam.so в /lib/libRaspberryCam.so, но это тоже ничего не изменило.

Кстати, я изменил права доступа к файлу.so на 755 (чтение, запись, выполнение для пользователя root и чтение, выполнение для мира).

Если честно, я не очень разбираюсь в импорте DLL-файлов, поэтому я мог бы просто ошибиться здесь. Однако на прошлой неделе я уже написал комментарий на странице проекта raspberrycam, но пока не получил никакого ответа.

Кто-нибудь может мне помочь с этим вопросом?

Спасибо Доминик

Изменить: Код фактического DLLImport взят из проекта Raspberrycam "RaspberryCamInterop.cs":

using System;
using System.Runtime.InteropServices;

namespace RaspberryCam.Interop
{
    public class RaspberryCamInterop
    {
        [DllImport("RaspberryCam.so", EntryPoint = "TakePicture")]
        public static extern PictureBuffer TakePicture(string device, uint width, uint height, uint jpegQuantity);

        [DllImport("RaspberryCam.so", EntryPoint = "OpenCameraStream")]
        public static extern IntPtr OpenCameraStream(string device, uint width, uint height, uint fps);

        [DllImport("RaspberryCam.so", EntryPoint = "CloseCameraStream")]
        public static extern void CloseCameraStream(IntPtr src);

        [DllImport("RaspberryCam.so", EntryPoint = "ReadVideoFrame")]
        public static extern PictureBuffer ReadVideoFrame(IntPtr src, uint jpegQuantity);

        [DllImport("RaspberryCam.so", EntryPoint = "GrabVideoFrame")]
        public static extern PictureBuffer GrabVideoFrame(IntPtr src);
    }
}

Редактировать 2: Кажется, есть некоторая проблема с хрипом мягкого плавания. Сейчас я установил стандартный хард-плавающий распбиан (как было написано в руководстве на странице проекта: http://www.raspberry-sharp.org/eric-bezine/2012/10/mono-framework/installing-mono-raspberry-pi/) и это работает, ну, это не особенно быстро, но это сохраняет изображение. Я нахожу немного раздражающим, что они использовали хард-плавающий распбианский образ, хотя моно не совместимо с ARM хард-плавающим аби. В руководстве по установке mono они также не упоминают ни одного исправления с плавающей запятой, и я даже нашел некоторые обходные пути в исходном коде проекта RaspberryCam, поэтому они заметили ошибки, связанные с запуском mono на hard-float abi.

Фрагмент из "PicturesCache.cs"

//Timespan bug with ARM version of MONO, so we will use int in milliseconds
private readonly int duration;

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

Тем не менее, я все еще благодарен за любой совет или решение от вас.

3 ответа

Что работает для меня: я скопировал библиотеку в папку.exe и переименовал ее в libRaspberryCam.so.

С моей стороны качество очень плохое. Я не могу настроить камеру из этой библиотеки.

У меня было то же исключение, и оно было решено путем копирования RaspberryCam.so в /usr/lib (в отличие от корня /lib)

Ты пробовал с

$sudo make
$sudo make install

?

Проверьте права доступа к RaspberryCam.so и исправьте его как chmod.

до свидания

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