Как возвращается значение независимо от используемого языка. Он определяется только вызывающей сигнатурой функции. Поэтому я мог написать следующий источник 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 и обратно - минимальный пример