У меня есть структура "C", которая определяется как:
typedef unsigned char tUI8;
typedef struct
{
tUI8 Mode;
tUI8 Data[16];
} TestStruct;
И функция, которая берет указатель на эту структуру и заполняет данные:
void FillTest(tUI8 Mode, TestStruct *s);
Чтобы вызвать эту функцию, я написал код C # как:
[StructLayout(LayoutKind.Sequential)]
struct TestStruct
{
public byte Mode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Data;
}
static class NativeTest
{
[DllImport("Native.dll")]
public static extern void FillTest(byte mode, ref TestStruct s);
}
Это работает, но я подозреваю, что во время PInvoke маршаллер копирует структуру во время вызова и возврата вместо закрепления. Я могу сказать это, потому что даже если я не инициализирую структуру, она отлично работает.
TestStruct s;
//here s.Data == null!
NativeTest.FillTest(10, ref s); //<<< I expected an error here
//here s.Data points to a valid byte[] of length 16
Console.WriteLine(BitConverter.ToString(s.Data));
У меня вопрос: как определить сигнатуру PInvoke, используя структуру или класс, чтобы избежать копирования данных во время маршалинга?