То, что говорит Антон Тихий, правильно. Я просто хочу уточнить с некоторыми примерами. Использование «исправлено» работает, но это также заставляет вас использовать «небезопасно». Мне нравится избегать использования небезопасных везде, где это возможно. Использование маршала - способ обойти это.
Во-первых, допустим, у меня есть библиотека, созданная в C, со следующими определениями.
typedef struct {
int messageType;
BYTE payload[60];
} my_message;
/**
* \param[out] msg Where the message will be written to
*/
void receiveMessage(my_message *msg);
/*
* \param[in] msg The message that will be sent
*/
void sendMessage(my_message *msg);
В C # следующая структура будет эквивалентна структуре в C.
[StructLayout(LayoutKind.Sequential, Size = 64), Serializable]
struct my_message
{
int messageType;
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 60)]
byte[] payload;
public initializeArray()
{
//explicitly initialize the array
payload = new byte[60];
}
}
Так как сообщение в receiveMessage () задокументировано как [out], вам не нужно делать ничего особенного с массивом в структуре перед передачей его в функцию. i.e.:
my_message msg = new my_message();
receiveMessage(ref msg);
byte payload10 = msg.payload[10];
Поскольку сообщение в sendMessage () задокументировано как [in], вам необходимо заполнить массив перед вызовом функции. Перед заполнением массива массив должен быть явно создан перед использованием. i.e.:
my_message msg = new my_message();
msg.initializeArray();
msg.payload[10] = 255;
sendMessage(ref msg);
Вызов initializeArray () должен создать экземпляр массива в ранее выделенном пространстве, созданном в структуре для этого массива.