////////////////////////////////////////////////////////////////////////
[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);
////////////////////////////////////////////////////////////////////////
上面三个程序段,都是一些什么意思啊. 我想知道的是语法意思.谁能帮我解释一下.
就象上面,中括号的用法到底是什么,谁能不能系统的讲解一下.
哪位大侠出手相救一下,在此谢过了.
[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);
////////////////////////////////////////////////////////////////////////
上面三个程序段,都是一些什么意思啊. 我想知道的是语法意思.谁能帮我解释一下.
就象上面,中括号的用法到底是什么,谁能不能系统的讲解一下.
哪位大侠出手相救一下,在此谢过了.
可将该特性应用于类或结构。
通常,公共语言运行库控制类或结构的数据字段在托管内存中的物理布局。如果类或结构需要按某种方式排列,则可以使用 StructLayoutAttribute。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。LayoutKind 值 Sequential 用于强制将成员按其出现的顺序进行顺序布局。Explicit 控制每个数据成员的精确位置。利用 Explicit,每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。LayoutKind是个枚举值MarshalAsAttribute
该特性为可选特性,因为每个数据类型都有默认的封送处理行为。仅在可以将给定类型封送到多个类型时需要此属性。例如,可将字符串作为 LPStr、LPWStr、LPTStr 或 BStr 封送到非托管代码。默认情况下,公共语言运行库将字符串参数作为 BStr 封送到 COM 方法。可将 MarshalAsAttribute 属性应用于个别的字段或参数,使该字符串作为 LPStr 而不是 BStr 进行封送DllImportAttribute
该特性是使用非托管dll的重要特性。
DllImportAttribute 特性提供对从非托管 DLL 导出的函数进行调用所必需的信息。作为最低要求,必须提供包含入口点的 DLL 的名称。
[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);
}
}
}