Как мне указать интерфейс P / invoke для этого кода? - PullRequest
2 голосов
/ 07 октября 2011

В C ++ у меня есть код, требующий передачи const char * в:

void Load(const char *filename)

Если я попытаюсь использовать String, как MSDN, кажется, предлагает:

[DllImport("foo.dll")]
protected static extern void Load(String filename);

В итоге я получаю исключение, в котором говорится, что вызов имеет несбалансированный стек из-за несоответствия между управляемым вызовом P / Invoke и действительной сигнатурой функции C ++.

Какую сигнатуру функции C # мне нужно использовать? Я пытался найти ответ, но ничего не придумаю.


Решение: Оказывается, причина, по которой я получаю ошибку "несбалансированного стека", заключалась в том, что выполняемый мной тестовый код вызывал файл, которого на самом деле не было в каталоге. С CallingConvention=cdecl и файлом в соответствующем месте проблема была решена.

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Проблема в соглашении о вызовах. И пока мы на этом, вам, вероятно, нужно указать набор символов, так как он может принять Unicode иначе:

[DllImport("foo.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.Cdecl)]
protected static extern void Load(String filename);
0 голосов
/ 07 октября 2011

Вы можете добавить MarshalAsAttribute, например,

[DllImport("foo.dll")]
protected static extern void Load(
    [MarshalAs(UnmanagedType.LPStr)]string filename);

Вы можете передать одно из значений UnmanagedType в конструктор MarshalAsAttribute.

См. Также эту обзорную статью в Code Project .

...