title: Best Way To Marshal A Pointer of Array of Struct
body: <p>I'm calling functions from C++ that returns a pointer to an array of struct and I'm having problems since I'm new to this operation/implementation. </p>
  
  <p>My C++ codes:</p>
  
  <pre><code>// 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 &lt; VarCounter; x++)
          {
              // Codes here assign data to mData[x]
          }
          return mData;
  }
  </code></pre>
  
  <p>Question:
  How can I call the C++ function GetData to C#?</p>
  
  <p>My current codes in C# are:</p>
  
  <pre><code>[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);
  </code></pre>
  
  <p>When I compiled it, there's an exception:
  "Cannot marshal 'return value': Invalid managed/unmanaged type combination."</p>
  
  <p>Sorry for the poor coding... Please help...</p>