3


0

Marshal.PtrToStructureを呼び出すときのAccessViolationException

Marshal.PtrToStructure(intPtr、typeof(Servent))を呼び出してAccessViolationExcpetionを取得しています。 私が間違ったことをしたアイデアはありますか? これを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 Answer


4


問題は、 `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


おそらく、文字列フィールドのレイアウト方法を指定する必要があります。そうしないと、マーシャリングで型の正しいサイズを決定できません。