共用方式為


SysTime 範例

更新:2007 年 11 月

這個範例示範,如何將指示傳遞給 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 參數傳遞。因為類別是參考型別,預設會被當成 In 參數,所以必須以 InAttributeOutAttribute 屬性宣告參數。對於要接收結果的呼叫端,必須明確地套用這些方向屬性。App 類別建立會建立 SystemTime 類別的新執行個體,並存取其資料欄位。

下列程式碼範例的原始程式碼是由 .NET Framework 平台叫用技術範例所提供。

程式碼範例

Imports System
Imports System.Runtime.InteropServices     ' For StructLayout,
                                           '  and DllImport


' Declares a class member for each structure element.
<StructLayout(LayoutKind.Sequential)> _
Public Class SystemTime
   Public year As Short
   Public month As Short
   Public weekday As Short
   Public day As Short
   Public hour As Short
   Public minute As Short
   Public second As Short
   Public millisecond 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


Public Class App
   Public Shared Sub Main()
      Console.WriteLine("VB .NET SysTime Sample using " _
                      + "Platform Invoke")
      Dim st As New SystemTime()
      LibWrap.GetSystemTime(st)
      Console.Write("The Date is: " _
                  + "{0} {1} {2}", st.month, st.day, st.year)

   End Sub 'Main
End Class 'App

預期的輸出:

使用平台叫用的 VB .NET SysTime 範例

日期為:10 31 2006

using System;
using System.Runtime.InteropServices;     // For StructLayout, DllImport


[ StructLayout( LayoutKind.Sequential )]
public class SystemTime 
{
   public ushort year;
   public ushort month;
   public ushort weekday;
   public ushort day;
   public ushort hour;
   public ushort minute;
   public ushort second;
   public ushort millisecond;
}

public class LibWrap 
{
   // Declares a managed prototype for the unmanaged function using Platform Invoke.
   [ DllImport( "Kernel32.dll" )]
   public static extern void GetSystemTime( [In,Out] SystemTime st );
}

public class App
{
public static void Main()
    {
    Console.WriteLine("C# SysTime Sample using Platform Invoke");
    SystemTime st = new SystemTime();
    LibWrap.GetSystemTime(st);
    Console.Write("The Date is: ");
    Console.Write("{0} {1} {2}",  st.month, st.day, st.year );
    }
}

預期的輸出:

使用平台叫用的 C# SysTime 範例

日期為:10 31 2006

請參閱

概念

封送處理類別、結構和等位

平台叫用資料型別

在 Managed 程式碼中建立原型