У меня есть функция в C ++ DLL, которая принимает один ввод.Я пытаюсь использовать этот вход в качестве вывода для вызова C #.
Вот моя функция C ++:
MYAPI int testStuff3(unsigned char* str)
{
printf("%s\n", str);
str = (unsigned char*)malloc(9);
str[0] = 'G';
str[1] = 'o';
str[2] = 'o';
str[3] = 'd';
str[4] = 'b';
str[5] = 'y';
str[6] = 'e';
str[7] = '!';
str[8] = '\0';
return 1;
}
Вот код C #:
public class Program
{
[DllImport("NativeLib.dll")]
private static extern int testStuff3([In, Out] IntPtr str);
static void Main(string[] args)
{
IntPtr junk3 = IntPtr.Zero;
int ret = testStuff3(junk3);
Byte[] stuff3 = new byte[9];
Marshal.Copy(junk3, stuff3, 0, 9);
}
}
Когда вызывается Marshal.Copy, он выдает ошибку о том, что источник (junk3) не может быть нулевым.
Это не будет работать, отправляя нулевой указатель на C ++ DLL из C # и имеяDLL выделяет память и хранит что-то внутри и возвращает это вызывающей стороне?Я хочу сохранить это IntPtr, а не StringBuilder, потому что данные не обязательно будут строкой в конечном коде.Просто массив без знака в C ++, и я хочу, чтобы IntPtr указывал на него.
Я пробовал различные варианты [In, Out], [Out], out и ref для передачи IntPtr.