Лучший путь к маршалу Указатель массива структур - PullRequest
1 голос
/ 14 января 2010

Я вызываю функции из C ++, которые возвращают указатель на массив struct, и у меня возникают проблемы, так как я новичок в этой операции / реализации.

Мои коды C ++:

// My C++ Structs
typedef struct _MainData {
 double  dCount;
 DataS1         *DS1;
 int  iCount1;
 DataS2         *DS2;
 int  iCount2;
}MainData;

typedef struct _DataS1 {

 unsigned int uiCount1; 
 unsigned int uiCount2; 
 int  iCount;
 void  *pA; 
 void  *pB; 

} DataS1;

typedef struct _DataS2 {
 unsigned int uiCount1; 
 unsigned int uiCount2;    
 unsigned int uiCount3;    
 unsigned int uiCount4;   
 double  dCount; 
 int  iCount1;     
 char  strLbl[64];
} DataS2;

// My C++ Function
MainData* GetData(const int ID)
{
        MainData* mData;
        int iLength = Get_Count();
        mData = new MainData[iLength];
        for(int x = 0;x < VarCounter; x++)
        {
            // Codes here assign data to mData[x]
        }
        return mData;
}

Вопрос: Как я могу вызвать функцию C ++ GetData для C #?

Мои текущие коды в C #:

[DllImport(".\\sdata.dll")]
[return: MarshalAs(UnmanagedType.LPArray)]
private static unsafe extern MainData[] GetData(int ID);

// The struct MainData in my C# side is already "Marshalled"...

//My function call is here:
MainData[] SmpMapData = GetData(ID);

Когда я скомпилировал это, есть исключение: «Невозможно выполнить маршализацию« возвращаемого значения »: недопустимая комбинация управляемого / неуправляемого типа.»

Извините за плохое кодирование ... Пожалуйста, помогите ...

Ответы [ 2 ]

0 голосов
/ 15 января 2010

Я пытался сделать то же самое, но безуспешно из-за нехватки времени, но кое-что узнал в процессе:

  1. Распределить память в C #
  2. Чтобы передать массив структур, структура должна быть blittable .

Удачи с этим, я не смог заставить его работать.

0 голосов
/ 14 января 2010

Одна проблема состоит в том, что маршаллер не знает, сколько элементов в массиве возвращено кодом C ++. Альтернативный подход может состоять в том, чтобы иметь два метода C ++ - один, который возвращает количество элементов, и один, который возвращает одну MainData с указанным индексом.

Как выглядят ваши структуры на стороне C #?

Поскольку вы кодируете обе стороны C ++ и C #, может быть проще использовать C ++ / CLI для их взаимодействия вместо PInvoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...