Передача неуправляемой структуры C ++ по ссылке на управляемый метод C ++ вызывает нарушение прав доступа при ссылке на структуру

Я пытаюсь передать эту структуру:

#pragma unmanaged
typedef struct
{
   void* data;
   unsigned nlen;
   unsigned int type; 
} PARAMETER;

К статическому методу этого класса:

#pragma managed
private class __gc GlobalFunctions
{
   static void WriteField(Object* object, PARAMTER& par, unsigned dec)
   {
       switch (par.type)
       {
          ....
       }
   }
};

Из этой функции:

public class __gc WorkerClass
{
   void SetValueAt(long index, Object* value)
   {
      PARAMETER aux;
      aux.type = 3;
      GlobalFunctions::WriteField(value, aux, 0);
   }
};

В 64-битной системе я получаю сообщение о нарушении прав доступа, в котором говорится, что адрес «0x000c» не может быть прочитан.

Теперь в 64-битной системе разыменование par.type было бы адресом 0x0c, если бы ссылка на par была нулевым указателем. За исключением того, что par находится в стеке - я не передаю нулевой указатель в WriteField, но, похоже, я получаю его.

Теперь, в Managed C ++, при вызове из одного метода экземпляра управляемого класса к другому статическому методу, является ли тот факт, что я передаю неуправляемую структуру по ссылке, уязвимой для какой-то проблемы маршаллинга?

Есть ли какая-либо веб-документация, объясняющая, как неуправляемые структуры обрабатываются управляемым кодом?


person Eli    schedule 28.07.2009    source источник


Ответы (1)


Управляемый и неуправляемый код должны быть явно скомпилированы как управляемый / неуправляемый. Если управляемый и неуправляемый код смешан в одном файле, необходимо использовать прагму управляемую и неуправляемую. Также имейте это в виду, когда используете включаемые файлы.

person steve    schedule 28.07.2009