Вызов C # из нативного, чтобы получить строку

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

Я видел несколько примеров передачи данных из и в собственный код, но ни один из примеров не использовал возвращаемые значения.

То, что я хотел бы сделать, это иметь функцию C #, которая возвращает строку, так что я могу вытащить это из C # обратно в C ++, то есть вызвать C # из C ++, а не другим способом.

String GetSomeString() { return "foo"; } // C#

И вызвать эту функцию из нативного кода, который будет иметь такую ​​подпись:

typedef const wchar_t * (__stdcall * native_func_t)();

Проблема в том, что это просто не работает. NotSupportedException генерируется, когда я передаю свой делегат нативному коду. Однако, если я заменю возвращаемый тип String на void, он будет работать отлично.

Другие решения будут:

  • Вызвать C # из C ++, чтобы получить длину строки, выделить эту строку в C ++, передать ее в C # и заставить ее заполнить буфер с помощью небезопасного кода. Но это грязно и непрактично, поэтому я не буду этого делать.

  • Сделайте так, чтобы функция C # вызывала C ++, который будет где-то хранить результат, и в нативном коде извлекает тот результат, где он был сохранен после возврата вызова C #. Но это тоже очень некрасиво и непрактично.

Вы видите другой способ сделать это, пожалуйста?

0

Решение

Вопрос задавался уже на stackoverflow и других сторонах.

Один пост в стеке потока Вызов функции C # из C ++ DLL.

Связанные решения используют CallingConvention.StdCall, который доступен в CF, но вместо этого вы можете использовать CallingConvention.WinApi, что переводится в CallingConvention.StdCall в соответствии с этим сайтом.
https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.90%29.aspx

Вы также можете использовать другие методы взаимодействия, такие как пользовательские сообщения (SendMessage) между окнами и дескрипторами форм.

Чтобы выставить управляемые компоненты на C ++, используйте COM (см. https://msdn.microsoft.com/en-us/library/zsfww439%28v=vs.80%29.aspx)

0

Другие решения

На самом деле кажется, что никакая функция C # не может вернуть что-либо при вызове из C ++.
Любой тип возврата oher, чем void вызовет исключение NotSupportedException.

Я не нашел доказательств этого в документации MSDN, но после многих испытаний кажется, что так оно и есть, по крайней мере, с компактный каркас.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector