C # 'String' в C ++ 'std :: string' - PullRequest
       27

C # 'String' в C ++ 'std :: string'

0 голосов
/ 09 июля 2019

У меня есть C # DLL, имеющая нижеуказанную функцию:

[DllExport(ExportName = "getOutputString", CallingConvention = CallingConvention.StdCall)]
public static String getOutputString()
{
    String managedString = "123456789012345678901234567890";
    return managedString;
}

и приложение C ++ для использования вышеуказанной функции как:

HMODULE mod = LoadLibraryA("MyCustomDLL.dll");
using GetOutputString = std::string (__stdcall *) ();
GetOutputString getOutputString = reinterpret_cast<GetOutputString>(GetProcAddress(mod, "getOutputString"));

и хочу сохранить строку из DLLв переменной C ++ как:

std::string myVariable = getOutputString();

Когда я запускаю приложение C ++, оно вылетает.

Но когда я просто использую функцию в коде std :: printf, она прекрасно работает:

std::printf("String from DLL: %s\n", getOutputString());

Моя настоящая задача - получить массив DLL из DLL, но если вы можете помочь мне получить простую строку из C # в std :: string в C ++, это было бы здорово.

Илипросто дайте мне подсказку, чтобы сохранить напечатанную строку через std :: printf () в переменной типа std :: string.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

C ++ с CLI, используйте System :: String ^ (это строка .Net, т.е. такая же, как в C #)

using GetOutputString = System::String^ (__stdcall *) ();

Затем вы можете сделать это

std::string standardString = context.marshal_as<std::string>(managedString);

(Кредит [https://stackoverflow.com/a/1300903/1848953])

0 голосов
/ 09 июля 2019

Согласно документация , C # маршалы string объекты как простой "указатель на завершенный нулем массив символов ANSI", или const char * в терминах C ++.

Если вы измените typedef на GetOutputString, чтобы вернуть const char *, все будет работать.

...