title: SafeArrayTypeMismatchException when passing c# struct to unmanaged C++ DLL
body: <p>Hi I'm new to C# and C++ programming and trying to use an unmanaged C++ dll in a C# project (.NET 3.5). I'm stuck on this error:</p>
  
  <p>System.Runtime.InteropServices.SafeArrayTypeMismatchException: Specified array was not of the expected type.</p>
  
  <p>Here is the header file for the DLL </p>
  
  <pre><code>#ifdef FUNCTIONLIB_EXPORTS
  #define FUNCTIONLIB_API __declspec(dllexport)
  #else
  #define FUNCTIONLIB_API __declspec(dllimport)
  #endif
  typedef struct _FunctionOpt 
  {
      char                UserName[32];
      char                Password[32];
      char                ServerIP[128];
      int                 ServerPort;
      int                 Index;          
      char                TargetSubChannel;
      long                Timeout;
      char                Filepath[256];
      bool                isFirst;        
      DWORD               SyncTime;               
      char                *pOutBuf;               
      int                 OutBufSize;
      unsigned short      OutImgResW;
      unsigned short      OutImgResH;
  
  }STFUNCTIONOPT, *PSTFUNCTIONOPT;
  
  FUNCTIONLIB_API int FunctionLib_Snapshot( PSTFUNCTIONOPT pstFunctionOpt ); 
  </code></pre>
  
  <p>I don't have access to the C++ code so I can only change the following C# code. My relevant code is as follows:</p>
  
  <pre><code>    public unsafe struct PSTFUNCTIONOPT            
      {
          public char[] UserName;
          public char[] Password;
          public char[] ServerIP;
          public int ServerPort;
          public int Index;                      
          public char TargetSubChannel;              
          public long Timeout;              
          public char[] Filepath;
          public bool isFirst;               
          public uint SyncTime;                       
          public char *pOutBuf;   // example C++ usage: myStruct.pOutBuf = (char*)malloc(1920 * 1080 * 3);
          public int OutBufSize;
          public ushort OutImgResW;
          public ushort OutImgResH;
      }
  
      // need to use dumpbin to get entrypoint name due to c++ mangling
      [DllImport(@"C:\Location\To\Project\bin\FunctionLibLib.dll", EntryPoint = "?FunctionLib_Snapshot@@YAHPAU_FunctionOpt@@@Z")]
      public static extern int FunctionLib_Snapshot(PSTFUNCTIONOPT pstFunctionOpt);
  
      public unsafe int FunctionLib_Run()
      {
          PSTFUNCTIONOPT stFunctionOpt = new PSTFUNCTIONOPT();
  
          stFunctionOpt.UserName = ("uname").ToCharArray();
          stFunctionOpt.Password = ("pword").ToCharArray();
          stFunctionOpt.ServerIP = ("192.168.1.1").ToCharArray();
          stFunctionOpt.ServerPort = 80;
          stFunctionOpt.Index = 255;
          stFunctionOpt.Timeout = 15000;
          stFunctionOpt.Filepath = ("c:\\temp\\test.jpg").ToCharArray();
          stFunctionOpt.isFirst = true;
          stFunctionOpt.SyncTime = 0;
      //stFunctionOpt.pOutBuf = new char*[10000];     // not sure how to do this yet
          stFunctionOpt.OutBufSize = 10000;
  
          // get result from DLL 
          return FunctionLib_Snapshot(stFunctionOpt);
      }
  </code></pre>
  
  <p>How do I properly pass the struct to this unmanaged DLL? The error seems like something simple but I haven't been able to narrow down the problem. Any help is appreciated!</p>