DLL Pinvoke с портированием библиотек Windows Mobile C ++ на C # - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь использовать 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):

Удалено удаленное соединение с устройством

1 Ответ

0 голосов
/ 18 декабря 2011

Поскольку я не вижу ответов, я публикую свой ответ (хотя у меня все еще есть проблемы с этим)

Проблема может быть решена путем добавления каталогов, в которые должны быть развернуты dll:

Project-> Properties -> Deployment -> Remote Directory

и правильно указать файлы в:

Project-> Properties -> Deployment -> Additional Files

как

highgui200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0
cv200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0
cxcore200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0
ml200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0
msvcr90.dll|$(BINDIR)\$(INSTRUCTIONSET)\|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0
...