Я передаю байт [] в функцию, принимающую беззнаковый символ *
Один из способов сделать это - передать IntPtr и выделить / освободить память в управляемом коде следующим образом:
в C ++ DLL
extern "C"
{
__declspec(dllexport) void __stdcall Foo(int length, unsigned char** message);
}
в C #
[DllImport(@"MyDll.dll"]
public static extern void Foo(int length, ref IntPtr msg);
byte[] msg = new byte[] {0,1,2,3};
IntPtr ip = Marshal.AllocHGlobal(msg.Length);
Marshal.Copy(msg, 0, ip, msg.Length);
UnmanagedCode.Foo(msg.Length, ref ip);
Marshal.FreeHGlobal(ip);
Я тоже могу это сделать:
в C ++ DLL
extern "C"
{
__declspec(dllexport) void __stdcall Foo(int length, unsigned char* message);
}
в C #
[DllImport(@"MyDll.dll"]
public static extern void Foo(int length, byte[] msg);
byte[] msg = new byte[] {0,1,2,3};
UnmanagedCode.Foo(msg.Length, msg);
Обе реализацииработают хорошо, но во втором примере, как управляется память (для неподписанного сообщения char *).Я предполагаю, что память выделяется, когда выполняется вызов Foo, и освобождается, когда он возвращается (поэтому он ведет себя так же, как в первом примере) - это правильно?
Спасибо