Я пытаюсь использовать OpenCV как здесь , и я застрял в один момент, когда я получаю PInvoke, а именно:
мой 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:
Хорошо, теперь это действительно странно. Я изменил несколько вещей. Я добавил библиотеки openCV в список развертывания в свойствах проекта, чтобы видеть, что они копируются при развертывании, и вручную скопировал все библиотеки dll в каталог exe на ПК.
Я также изменил некоторые параметры развертывания в проекте DLL, чтобы dll копировались в соответствующий каталог (автоматически) на телефоне и ....
теперь у меня ошибка во время выполнения (при попытке доступа к функции из dll - opencv):
Удалено удаленное соединение с устройством