Что означает «Недопустимая комбинация управляемого / неуправляемого типа». означает?

#c# #.net #struct #marshalling

#c# #.net #структура #сортировка

Вопрос:

У меня есть следующая структура:

     [StructLayout(LayoutKind.Auto,Pack=0)]
    private unsafe struct BIRDSYSTEMCONFIG
    {
        public byte bySystemStatus;
        public byte byError;
        public byte byNumDevices;
        public byte byNumServers;
        public byte byXmtrNum;
        public ushort wXtalSpeed;
        public double dMeasurementRate;
        public byte byChassisNum;
        public byte byNumChassisDevices;
        public byte byFirstDeviceNum;
        public ushort wSoftwareRev;
        public fixed byte byFlockStatus[127];
    }
  

На основе структуры C :

 typedef struct tagBIRDSYSTEMCONFIG
{
    BYTE    bySystemStatus;     // current system status (see bird system status bits, above)
    BYTE    byError;            // error code flagged by server or master bird
    BYTE    byNumDevices;       // number of devices in system
    BYTE    byNumServers;       // number of servers in system
    BYTE    byXmtrNum;          // transmitter number (see transmitter number bits, above)
    WORD    wXtalSpeed;         // crystal speed in MHz
    double  dMeasurementRate;   // measurement rate in frames per second
    BYTE    byChassisNum;       // chassis number
    BYTE    byNumChassisDevices; // number of devices within this chassis
    BYTE    byFirstDeviceNum;   // number of first device in this chassis
    WORD    wSoftwareRev;       // software revision of server application or master bird
    BYTE    byFlockStatus[BIRD_MAX_DEVICE_NUM   1]; // status of all devices in flock, indexed by bird number (see note in BIRDFRAME definition) - see bird flock status bits, above
} 
BIRDSYSTEMCONFIG;
  

И следующая функция:

     [DllImport(@"Bird.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern bool birdGetSystemConfig(
        int nGroupID,
        ref BIRDSYSTEMCONFIG psyscfg,
        bool bGetDriverCopy
        );
  

На основе функции C :

 BOOL DLLEXPORT birdGetSystemConfig(int nGroupID, BIRDSYSTEMCONFIG *psyscfg, BOOL bGetDriverCopy = FALSE);
  

Которое я вызываю следующим образом:

 BIRDSYSTEMCONFIG sysconf = new BIRDSYSTEMCONFIG();
birdGetSystemConfig(1, ref sysconf, true);
  

Но получаю сообщение об ошибке, сообщающее мне:

Не удается маршалировать ‘параметр # 2’: недопустимая комбинация управляемого / неуправляемого типа.

Что это значит? Почему это происходит? Как я могу это преодолеть? Все предложения приветствуются!

Комментарии:

1. Вы должны опубликовать исходную структуру C .

2. Взгляните сюда: groupsrv.com/dotnet/about24649.html

Ответ №1:

Оказывается, все, что мне нужно было сделать, это изменить:

 [StructLayout(LayoutKind.Auto,Pack=0)]
  

Для

 [StructLayout(LayoutKind.Sequential,Pack=0)]
  

Поскольку вопрос касался не только того, как его решить, я оставлю его открытым на некоторое время. Было бы неплохо узнать немного больше об этой ошибке.