Маршал исключение при использовании массивов структур - PullRequest
0 голосов
/ 29 марта 2012

Я получаю следующую ошибку:

ArgumentException не обработан Тип не может быть маршализован, поскольку длина экземпляра встроенного массива не соответствует объявленной длине в макете.

On line Marshal.StructureToPtr (msg, buff, true

public static Byte[] SerializeMessage<T>(T msg) where T : struct
{
     int objsize = Marshal.SizeOf(typeof(T));
     Byte[] ret = new Byte[objsize];
     IntPtr buff = Marshal.AllocHGlobal(objsize);
     Marshal.StructureToPtr(msg, buff, true);
     Marshal.Copy(buff, ret, 0, objsize);
     Marshal.FreeHGlobal(buff);
     return ret;
}

Ниже приведены структуры, которые я пытаюсь использовать:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MsgStruct
{
    public uint result;
    public DS.DataSvcMetZoneDataC zone;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)]
    public Types.GeographicLocationType[] geoLocation;
    static public MsgStruct NewMsgStruct()
    {
        MsgStruct retValue = new MsgStruct();
        retValue.geoLocation = new Types.GeographicLocationType[10];
        for (int i = 0; i < 10; i++)
        {
            retValue.geoLocation[i] = Types.GeographicLocationType.NewMsgStruct();
        }
       return retValue;
    }
}

и

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct GeographicLocationType
{
    public double altitude;
    public double latitude;
    public double longitude;
    static public GeographicLocationType NewMsgStruct()
    {
        GeographicLocationType structType = new GeographicLocationType();
        return structType;
    }
}

и

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DataSvcMetZoneDataC
{
    public int metID;
    public ushort zoneNumber;
    public ushort isDefined;
    public double windDirection;
    public double windSpeed;
    public double airTemperature;
    public double airPressure;
    public ulong dataModifiedInd;
    static public DataSvcMetZoneDataC NewMsgStruct()
    {
        DataSvcMetZoneDataC structType = new DataSvcMetZoneDataC();
        return structType;
    }
}

Я работаю, когда у меня нет массива позиций, но их имена 1 ... 10 кажется плохим решением для чего-то, чтодолжен уметь работать с массивом.

...