У меня есть (C/C++) DLL, которую я вызываю DLLImport в проект C#. Эта библиотека имеет этот метод:Передача указателей из неуправляемого кода без модификатора
int __stdcall Connect(OUT int *p_sessionID, IN BYTE mode, IN BYTE comport, IN char *servername, IN DWORD serverport);
Я пытался несколько способов «перевести» его на C#, но тот, который я нахожу ближе:
[DllImport("UnmanagedDLL.dll", EntryPoint = "Connect", CallingConvention = CallingConvention.StdCall)]
private static extern unsafe int CS1_Connect(out IntPtr p_sessionID, byte mode, byte comport, string servername, int serverport);
Я пытаюсь вызвать так:
IntPtr connection;
var i = Connect(out connection, 1, 0, "192.0.0.1", 1982);
Но я всегда получаю следующее сообщение об ошибке:
Дополнительная информация: вызов для функции PInvoke «DllImportTest! DllImportTest.Program :: Connect» имеет несбалансированный стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре. Убедитесь, что соглашение о вызове и параметры сигнатуры PInvoke соответствуют целевой неуправляемой подписи.
Я знаю, что могу связаться с DLL, потому что у меня есть другой метод, который работал нормально.
Что я делаю неправильно?
Спасибо.
Первый аргумент должен быть 'out int'. Но это не объясняет предупреждение MDA, вам придется предположить, что документация функции устарела. Нет другого способа проверить, все украшения были удалены. Вы должны связаться с автором библиотеки для получения поддержки. –
Это объясняет MDA, если цель была 64 бит –
Не совсем, IntPtr растет, а первые 4 args передаются через регистры вместо стека. –