Я пытаюсь использовать OpenCV в here, и я застрял в один момент, когда я получаю PInvoke, а именно:DLL PInvoke с библиотеками Windows Mobile C++ портирования на C#
мой DLL.cpp
#define DLL_API __declspec(dllexport)
//...
DLL_API short processImage(const char* in_file, const char * out_file)
//...
мой form.cs
[DllImport("DLL", EntryPoint = "processImage")]
private static extern short _ProcessImage(byte[] in_file, byte[] out_file);
public static short binarizeImage(string in_file, string out_file)
{
return _ProcessImage(StringToASCIIByteArray(in_file), StringToASCIIByteArray(out_file));
}
public static byte[] StringToASCIIByteArray(string str)
{
return Encoding.ASCII.GetBytes(str + "\0");
}
Я думаю, что это может быть проблема с целевой архитектуры (в моем проекте VS 2008). Когда я использую «Любой процессор», он компилирует &, но бросает Pinvoke, когда я устанавливаю его на «Windows Mobile 6 Professional SDK (ARMV4I)», он компилируется, но не хочет развертываться, и я получил это в окне вывода:
1>------ Deploy started: Project: DLL, Configuration: Debug Windows Mobile 6 Professional SDK (ARMV4I) ------
1>The system cannot find the path specified.
1>
2>------ Deploy started: Project: smartDeviceOcr, Configuration: Debug Any CPU ------
2>Deploying 'D:\VS 2008 Projects\C++\SmartDevice\ocr\smartDeviceOcr\bin\Debug\smartDeviceOcr.exe'
========== Deploy: 1 succeeded, 1 failed, 0 skipped ==========
Имеет ли значение конкретное значение ARMV4I? У меня есть ARM920T на моем мобильном телефоне. Могу/должен ли я редактировать это, чтобы заставить его работать?
EDIT:
Просто чтобы быть ясно точки PInvoke к:
return _ProcessImage(StringToASCIIByteArray(in_file), StringToASCIIByteArray(out_file));
и сообщение об исключении:
System.MissingMethodException was unhandled
Message="Cannot find the library DLL PInvoke 'DLL'."
StackTrace:
in smartDeviceOcr.Form1.binarizeImage(String in_file, String out_file)
in smartDeviceOcr.Form1.button1_Click(Object sender, EventArgs e)
in System.Windows.Forms.Control.OnClick(EventArgs e)
in System.Windows.Forms.Button.OnClick(EventArgs e)
in System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
in System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
in Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
in System.Windows.Forms.Application.Run(Form fm)
in smartDeviceOcr.Program.Main()
EDIT2:
Хорошо, теперь это действительно странно. Я многое изменил. Я добавил DLL openCV в список развертывания в свойствах проекта, чтобы я мог видеть, что они копируются при развертывании, и я скопировал вручную все DLL-файлы в exe-каталог на ПК.
Я также изменил некоторые из вариантов развертывания в проекте DLL, так что библиотеки DLL копируются в соответствующий каталог (автоматически) на телефон и ....
теперь у меня есть ошибка во время выполнения (если пытается получить доступ к функции из DLL - OpenCV):
дистанционное подключение к устройству было потеряно
OpenCV - это собственный код.Вам понадобится версия, предназначенная для вашего процессора. –
Эта версия была создана для мобильных процессоров Windows (я использую версию с сайта, о котором я упоминал в начале. – Patryk
Маршрутизатор pinvoke, похоже, не согласен. Видение фактического сообщения об исключении поможет нам помочь вам диагностировать проблему. –