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.
до свидания