SysTime 範例
這個範例示範如何傳遞含有整數的類別至預期結構指標的 Unmanaged 函式。
SysTime 範例是使用下列 Unmanaged 函式,顯示其原始函式宣告:
從 Kernel32.dll 匯出 GetSystemTime。
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
傳遞到函式的原始結構包含以下元素:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
在這個範例中,SystemTime
類別包含表示為類別成員之原始結構的元素。設定 StructLayoutAttribute 屬性以確保成員是以其出現的順序在記憶體中被循序配置。
LibWrap
類別包含 GetSystemTime
方法的 Managed 原型,其預設會將 SystemTime
類別當成 In/Out 參數傳遞。必須以 InAttribute 和 OutAttribute 屬性宣告參數,因為類別 (其為參考型別) 預設會被當成 In 參數傳遞。對於要接收結果的呼叫端,必須明確地套用這些方向屬性。App
類別建立會建立 SystemTime
類別的新執行個體,並存取其資料欄位。
下列程式碼範例的原始程式碼是由 .NET Framework 平台叫用技術範例所提供。
宣告原型
' Declares a class member for each structure element.
< StructLayout(LayoutKind.Sequential )> _
Public Class SystemTime
Public year As Short
…
Public milliseconds As Short
End Class 'SystemTime
Public Class LibWrap
' Declares a managed prototype for the unmanaged function.
Declare Sub GetSystemTime Lib "Kernel32.dll" ( <[In], Out> ByVal st _
As SystemTime )
End Class 'LibWrap
// Declares a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
public class SystemTime
{
public ushort year;
…
public ushort milliseconds;
}
public class LibWrap
{
// Declares a managed prototype for the unmanaged function.
[ DllImport( "Kernel32.dll" )]
public static extern void GetSystemTime( [In,Out] SystemTime st );
}
呼叫函式
Public Class App
Public Shared Sub Main()
Dim st As New SystemTime()
LibWrap.GetSystemTime( st )
Console.Write( "The Date and Time is: " )
…
End Sub 'Main
End Class 'App
public class App
{
public static void Main()
{
SystemTime st = new SystemTime();
LibWrap.GetSystemTime( st );
Console.Write( "The Date and Time is: " );
…
}
}