다음을 통해 공유


SysTime 샘플

업데이트: 2007년 11월

이 샘플에서는 구조체에 대한 포인터를 필요로 하는 관리되지 않는 함수에 클래스에 대한 포인터를 전달하는 방법을 보여 줍니다.

SysTime 샘플에서는 다음의 관리되지 않는 함수를 사용합니다. 이 함수는 원래의 함수 선언과 함께 표시되어 있습니다.

  • 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 클래스에는 SystemTime 클래스를 기본적으로 In/Out 매개 변수를 통해 전달하는 GetSystemTime 메서드의 관리되는 프로토타입이 포함되어 있습니다. 참조 형식인 클래스는 기본적으로 In 매개 변수로 전달되므로 이 매개 변수는 InAttributeOutAttribute 특성과 함께 선언되어야 합니다. 호출자가 결과를 받으려면 이 방향 특성이 명시적으로 적용되어야 합니다. App 클래스에서는 SystemTime 클래스의 새 인스턴스를 만들고 해당 데이터 필드에 액세스합니다.

다음 코드 예제의 소스 코드는 .NET Framework Platform Invoke 기술 샘플을 통해 제공됩니다.

코드 샘플

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입니다.

참고 항목

개념

클래스, 구조체 및 공용 구조체 마샬링

플랫폼 호출 데이터 형식

관리 코드에서 프로토타입 만들기