Я застрял на этом весь день, но кажется, что это невозможно, по крайней мере, с помощью компактный каркас, вызвать из нативного кода метод 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 #. Но это тоже очень некрасиво и непрактично.
Вы видите другой способ сделать это, пожалуйста?
Вопрос задавался уже на 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)
На самом деле кажется, что никакая функция C # не может вернуть что-либо при вызове из C ++.
Любой тип возврата oher, чем void вызовет исключение NotSupportedException.
Я не нашел доказательств этого в документации MSDN, но после многих испытаний кажется, что так оно и есть, по крайней мере, с компактный каркас.