C # делегат со строковой ссылкой на c ++ callback - PullRequest
1 голос
/ 18 ноября 2009

Я написал приложение на C #, в котором используется неуправляемая DLL-библиотека c ++ через управляемую DLL-библиотеку c ++.В неуправляемой dll есть обратный вызов, что одним из ее параметров является std::string&.

Я не могу найти правильный способ обернуть это управляемой dll.Когда я использую String^, обратный вызов работает, но приложение C # ничего не получает в строке.Когда я использовал String^%, вещи начали падать в других местах, которые, кажется, не связаны (возможно, с повреждением памяти).

Итак, мой вопрос, как правильно это сделать?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Я не могу скопировать и вставить код здесь, но я попытаюсь объяснить снова. Я не могу использовать маршалинг в секции управляемого c ++, потому что я не вызываю функцию, а передаю делегат c # для обратного вызова.

В неуправляемой dll у меня есть обратный вызов, который требует такой функции: void Func(unsigned int, int, std:string &).

Моя цель - передать делегат c # из моей программы этому обратному вызову, поэтому в неуправляемом коде Я сделал делегат, подобный этому: delegate void DEL(unsigned int a, int b, String ^ c) и функцию, подобную: void mFunc(DEL ^ del), и этот маршал функции передает делегат в cb, который принимает неуправляемая функция подписки обратного вызова. Без знака int и int работают нормально, но строка всегда "", когда срабатывает функция C #.

0 голосов
/ 20 ноября 2009

Я не верю, что сортировка может иметь дело с std :: string. Я думаю, что вам нужно сделать свой собственный обратный вызов, который передает char *, а затем написать связующий код между ними.

Кроме того, после делегирования делегата в обратный вызов этот обратный вызов не считается ссылкой на объект, из которого мог быть сделан делегат. Поэтому, если делегат не является статическим методом, его нужно где-то заполнить на весь срок жизни неуправляемого обратного вызова.

0 голосов
/ 18 ноября 2009

Размещение некоторого кода поможет мне лучше понять и даст лучший ответ; но нет автоматического преобразования или сортировки String ^ в std :: string. Вам нужно было бы сделать маршалинг для себя, чтобы вернуть строку в код C #. Быстрый поиск может предоставить подробную информацию о том, как это сделать.

http://msdn.microsoft.com/en-us/library/42zy2z41.aspx

...