AccessViolationException при вызове Marshal.PtrToStructure - PullRequest
3 голосов
/ 01 сентября 2010

Я получаю AccessViolationExcpetion, вызывая Marshal.PtrToStructure (intPtr, typeof (Servent)).Есть идеи, что я сделал не так?Я пробовал это на x64.

    IntPtr intPtr = NativeMethods.GetServByName(name, "tcp");
     if (intPtr != IntPtr.Zero)
     {
        Servent servent = (Servent)Marshal.PtrToStructure(intPtr, typeof(Servent));
        result = System.Convert.ToInt32(IPAddress.NetworkToHostOrder(servent.s_port));
     }
     else
     {
        throw CreateWSAException();
     }


  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  internal struct Servent
  {
     public string s_name;
     public IntPtr s_aliases;
    public short s_port;
     public string s_proto;
  }

Ответы [ 2 ]

4 голосов
/ 01 сентября 2010

Проблема заключалась в том, что структура Servent отличается на x64:

struct  servent {
        char    FAR * s_name;           /* official service name */
        char    FAR * FAR * s_aliases;  /* alias list */
#ifdef _WIN64
        char    FAR * s_proto;          /* protocol to use */
        short   s_port;                 /* port # */
#else
        short   s_port;                 /* port # */
        char    FAR * s_proto;          /* protocol to use */
#endif
};
0 голосов
/ 01 сентября 2010

Вам, вероятно, нужно указать, как расположены строковые поля, иначе при сортировке не удастся определить правильный размер для типа.

...