Скачиваем maven libs

Как возвращается значение независимо от используемого языка. Он определяется только вызывающей сигнатурой функции. Поэтому я мог написать следующий источник DLL в C ++:

#include 

BOOL WINAPI DllMain(
  _In_ HINSTANCE hinstDLL,
  _In_ DWORD     fdwReason,
  _In_ LPVOID    lpvReserved
)
{
    return TRUE;
}

__declspec(dllexport) char *function1()
{
    char *foo = new char[100];
    // do stuff to fill in foo
    return foo;
}

__declspec(dllexport) void function2(char *out, int maxOutSize)
{
    // do stuff to fill in out
}

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

Обратите внимание, что это использует C ++ new[] для выделения памяти для function1(), поэтому необходимо будет ее освободить в какой-то момент, используя delete[].

В том же ключе, если память выделенные CLR в случае C #, вам нужно либо передать его обратно в C # DLL, чтобы он был правильно выпущен, либо найти безопасный способ уничтожить его на C ++, предполагая, что такая операция даже возможна.

Я буду на 100% честным здесь и скажу, что у меня нет никакой подсказки, если C ++ runtime и C # CLR будут хорошо играть вместе с распределением памяти. Таким образом, может быть, что единственный вариант - передать его обратно на C # для освобождения.

- Изменить -

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

Передача строк из C # в C ++ DLL и обратно - минимальный пример

0
задан Igor Gorbunov 6 April 2019 в 20:50
поделиться