Привет всем!
Пишу C# wrapper для СОМ объекта, и натолкнулся на такую вот непонятность.
Имеется интерфейс который в качестве параметра одного из методов
возвращает структуру. В ней имеется поле — указатель на байтовый массив с данными
и поле которое содержит размер массива. При импортировании автоматом, указатель на
массив конвертится в IntPtr и проставляется атрибут [ComConversionLoss],
что меня не сильно радует поскольку обращаться к данным через IntPtr не очень удобно.
Хочется поюзаь сразу byte[].
Для похожей ситуации в PInvoke я использовал параметр атрибута MarshallAs
SizeParamIndex(индекс параметра с длиной массива).
Вопрос такой — если я использую SizeParamIndex в структуре (см.ниже)
будет ли Мarshaler брать размер массива из поля в структуре или он его
из параметров метода дёргать станет?
public struct xStruct
{
// IDL: unsigned long dwLen
// Размер массива
public uint dwLen;
// IDL: unsigned byte* pbArray
// Указатель на массив байт
// Сom2net генерирует такой код.
// [ComConversionLoss]
// public IntPtr pbArray;
// Хочется сделать вот так.
[MarshallAs(UnmanagedType.LPArray, SizeParamIndex=0)]
public byte[] pbArray;
}