Прежде всего, ваш код - C ++, а не C. Ваша функция получает параметр типа std::string
, а использование std::string
означает, что ваш код на самом деле C ++.
Теперь этот тип параметракорень вашей проблемы.Вы не можете создать std::string
в .net, и вместо этого вам нужно будет использовать char*
для передачи строковых данных.Вам нужен следующий код:
C ++
__declspec(dllexport) void DisplayHelloFromDLL(char* a)
{
printf("%s\n", a);
}
C #
[DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void DisplayHelloFromDLL(string a);
static void Main ()
{
string a = "Hello";
DisplayHelloFromDLL(a);
}
По умолчанию p /вызвать маршаллинг для .net string
- передать char*
в качестве параметра [In]
.Нет необходимости в сложности IntPtr
, StringToHGlobalAnsi
, FreeHGlobal
, как предполагает один из других ответов.Если вы можете позволить маршаллеру p / invoke выполнять эту работу, то лучше сделать это.
Обратите внимание, что вам также необходимо убедиться, что ваши соглашения о вызовах совпадают.При условии, что вы не использовали никаких специальных опций компилятора при создании кода C ++, этот код по умолчанию будет использовать cdecl
соглашение о вызовах.Вы можете сопоставить это с параметром CallingConvention
с атрибутом DllImport
.