Вычурный чарр * - PullRequest
       9

Вычурный чарр *

1 голос
/ 22 февраля 2011

У меня есть следующая сигнатура метода на моем c ++ dll:

extern char *bpStringCalc(char *bpDirectory, char *issString);

И я пытаюсь вызвать его из c #, используя это:

[DllImport(@"C:\MuniAxis\Bp\BpDLL.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string bpStringCalc([MarshalAs(UnmanagedType.LPStr)] string bpDirectory,
                                         [MarshalAs(UnmanagedType.LPStr)] string issString);

Но он продолжает получать этоисключение:

'ConsoleApplication1! ConsoleApplication1.Program :: bpStringCalc' разбалансировал стек.Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью.Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.

Есть идеи?

Спасибо

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Попробуйте указать Cdecl соглашение о вызовах при импорте или __stdcall при экспорте. Смотрите этот почти похожий вопрос .

4 голосов
/ 22 февраля 2011

Несбалансированность стека, вероятно, больше связана с соглашением о вызовах, чем с фактическими аргументами.C ++ по умолчанию использует соглашение о вызовах __cdecl.C # по умолчанию __stdcall, потому что __stdcall - это соглашение, используемое Win32.Вам нужно либо установить соглашение о вызовах в операторе импорта в C #, либо указать __stdcall в двоичном файле C ++.

EDIT : выше былоотредактировано, чтобы исправить тот факт, что __cdecl и __stdcall имели только одно начальное подчеркивание каждый;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...