////////////////////////////////////////////////////////////////////////
[StructLayout(LayoutKind.Explicit)]
public struct IPHeader
{
    [FieldOffset(0)] public byte ip_verlen;
    [FieldOffset(1)] public byte ip_tos;
}
////////////////////////////////////////////////////////////////////////
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]
////////////////////////////////////////////////////////////////////////
[DllImport("kernel32.dll")]
public static extern  bool Beep(int frequency, int duration); 
////////////////////////////////////////////////////////////////////////
    上面三个程序段,都是一些什么意思啊. 我想知道的是语法意思.谁能帮我解释一下.
    就象上面,中括号的用法到底是什么,谁能不能系统的讲解一下.
    哪位大侠出手相救一下,在此谢过了.

解决方案 »

  1.   

    特性可以用来扩展元数据。StructLayoutAttribute特性(允许省略Attribute)
    可将该特性应用于类或结构。
    通常,公共语言运行库控制类或结构的数据字段在托管内存中的物理布局。如果类或结构需要按某种方式排列,则可以使用 StructLayoutAttribute。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。LayoutKind 值 Sequential 用于强制将成员按其出现的顺序进行顺序布局。Explicit 控制每个数据成员的精确位置。利用 Explicit,每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。LayoutKind是个枚举值MarshalAsAttribute
    该特性为可选特性,因为每个数据类型都有默认的封送处理行为。仅在可以将给定类型封送到多个类型时需要此属性。例如,可将字符串作为 LPStr、LPWStr、LPTStr 或 BStr 封送到非托管代码。默认情况下,公共语言运行库将字符串参数作为 BStr 封送到 COM 方法。可将 MarshalAsAttribute 属性应用于个别的字段或参数,使该字符串作为 LPStr 而不是 BStr 进行封送DllImportAttribute
    该特性是使用非托管dll的重要特性。
    DllImportAttribute 特性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。
      

  2.   

    虽然都是从MSDN里面抄出来的,但是还是很感谢你.不知道你的MSDN是从哪里来的,好像翻译有点错.把上面的"特性"全都改为"属性"就可以了.    希望谁能不能再给点通俗点的讲解啊.如果可以的话再给点例子.
      

  3.   

    例子
    [StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
    public class MySystemTime 
    {
       [FieldOffset(0)]public ushort wYear; 
       [FieldOffset(2)]public ushort wMonth;
       [FieldOffset(4)]public ushort wDayOfWeek; 
       [FieldOffset(6)]public ushort wDay; 
       [FieldOffset(8)]public ushort wHour; 
       [FieldOffset(10)]public ushort wMinute; 
       [FieldOffset(12)]public ushort wSecond; 
       [FieldOffset(14)]public ushort wMilliseconds; 
    }class LibWrapper
    {
       [DllImport("kernel32.dll")]
       public static extern void GetSystemTime([MarshalAs(UnmanagedType.LPStruct)]MySystemTime st);
    };class TestApplication
    {      
       public static void Main()
       {
          try
          {
             MySystemTime sysTime = new MySystemTime();
             LibWrapper.GetSystemTime(sysTime);
             Console.WriteLine("The System time is {0}/{1}/{2} {3}:{4}:{5}", sysTime.wDay,
                sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);            
          }         
          catch(TypeLoadException e)
          {
             Console.WriteLine("TypeLoadException : " + e.Message);
          }
          catch(Exception e)
          {
             Console.WriteLine("Exception : " + e.Message);
          }
       }
    }
      

  4.   

    我的msdn是属性没错,但是,Attribute应该被翻译成特性而不是属性:) property是属性。