Re[14]: И снова передача структуры с массивом в unmanaged фу
От: Аноним  
Дата: 28.11.06 09:12
Оценка:
Вариант 1:

-импорт

    [DllImport("my.dll", CharSet = CharSet.Ansi, EntryPoint="Command")]
    public static extern UDT1 Command1(UDT1 udt);



-объявление класса


    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public class UDT1
    {
    [MarshalAs(UnmanagedType.U2)]
    [FieldOffset(0)]
    public short rxStatus;
    [MarshalAs(UnmanagedType.U1)]
    [FieldOffset(2)]
    public byte datalen;
    [FieldOffset(3)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
    public byte[] data = new byte[255];
    }



--можно объявить структуру, но тогда массив нужно инициализировать в методе перед вызовом Command

--код простой


            UDT1 cmd = new UDT1();
            UDT1 cpy = new UDT1();

            cmd.rxStatus = 0;
            cmd.datalen = 1;

            cmd.data[0] = (byte)ValidatorCodes.SYNC_CMD;
            cpy = Validator.Command1(cmd);




--ошибка
Could not load type 'ValidatorClass.UDT1' from assembly 'ValidatorClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because it contains an object field at offset 3 that is incorrectly aligned or overlapped by a non-object field.

Т.е. массив чем-то левым перекрывается, чем и почему — неясно.

Если есть возможность попробовать, могу выслать саму библиотеку на мыло.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.