неуправляемый/управляемый интероп - проблемы, проходящие int

Я работаю над моим phd в химии, и по этой причине мне нужно написать программное приложение, чтобы помочь мне с изображением образцов под микроскопом. Этот микроскоп оснащен стадией нанопозиционирования x-y-z. Этап управляется с помощью неуправляемого DLL, написанного поставщиком оборудования на ВКЗ. Я мог бы предоставить вам более подробную информацию о необходимости, но позвольте мне начать с этого;

Один из методов в dll позволяет мне читать настройки для оси движения:

синтаксис C-":" -28-" Где BOOL является int 0 или 1 в соответствии с конвенцией.

Моя обертка C' содержит:

[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, string sAxes, int []iValArray);

Это кажется правильным для меня. Однако, когда я пытаюсь что-то подобное в моем основном приложении (для запроса оси 1,2 и 3):

Int32 [] _iValues = new Int32[3];
E7XXController.qSVO(m_iControllerID, "123", _iValues);

Я постоянно получаю массив, как это:

6, 0, 10 ", а я должен получить 0, 0 , 0" в соответствии с дисплеем на самом устройстве. Дополнительная функция:

BOOL E7XX_SVO (int ID, const char* szAxes, const BOOL* pbValueArray) to set the same status bits on the stage also don't work... установить тот же статус биты на сцене также не работают ...

Другие команды в длл работают отлично. Я могу пройти строки и удваивает в и без troublem, но не типа BOOL ...

Вы, ребята, есть какие-либо идеи, что может быть не так?

Ответ на: "неуправляемый/управляемый интероп - проблемы, проходящие int"

Количество ответов:4

BOOL в C' на самом деле "Int" поэтому убедитесь, что вы используете System.Int32, а не System.Boolean.Кроме того, он может использовать COM типов данных, т.е. VARIANT_BOOL, и в этом случае вам нужно делать нужно System.Boolean.Пытались ли вы запустить зритель зависимостей, чтобы подтвердить прототип функции?

Это не собирается отвечать на ваш вопрос напрямую, но сладкий инструмент для получения общих Interop Win32 звонки легко использует Pinvoke.net даже визуальный плагин studio.

http://www.pinvoke.net/index.aspx

docs for your function say: говорят: "--62-" компилятор ВКЗ нуждается в экстерне "C" модификатор. В декларации также должно быть указано, что эти функции должны называться как стандартные функции Win-API. Это означает, что компилятор VC должен видеть в декларации модификатор WINAPI или модификатор __stdcall.

По умолчанию вызова конвенции для DllImport is является WinApi . На Windows, это StdCall. Но на CE, это Cdecl. Вы хотите, чтобы убедиться, что вы используете право вызова конвенции. Вы можете лоток добавив:

CallConvention = CallingConvention.StdCall

Кроме того, указать наш набор строк характер:

CharSet = CharSet.Ansi

Но он должен работать даже без них. Это довольно странно, так как ваш код выглядит правильно.

Вы пробовали указать атрибут MarshalAs, например:-----"-"-" Кроме того, вы пытались буквально прохождения строки sAxes как символ массива, например:---75-" Я обнаружил, что с interop вы часто нужно экспериментировать справедливый бит, чтобы получить его работы, так что попробуйте различные комбинации, проверить различные члены UnmanagedType перечисления, а также играть о с другими людьми предложения тоже. Однако, пожалуйста попробуйте вышеуказанные 2 метода и препятствуйте мне знать помогают ли они сортировать его!