Пример SysTime
Обновлен: Ноябрь 2007
В этом примере показан способ передачи указателя на класс неуправляемой функции, ожидающей указатель на структуру.
В примере для SysTime используются следующие неуправляемые функции, показанные с соответствующим исходным объявлением.
Функция GetSystemTime, экспортированная из Kernel32.dll.
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, который по умолчанию передает класс SystemTime в качестве параметра In/Out. Этот параметр должен быть объявлен с атрибутами InAttribute и OutAttribute, так как классы, являющиеся ссылочными типами, по умолчанию передаются как параметры In. Чтобы вызывающий объект получал результаты, необходимо явным образом применить атрибуты направления. Класс 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
Ожидаемый результат:
Пример SysTime в VB .NET, использующий вызов неуправляемого кода
Значение даты равно 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 );
}
}
Ожидаемый результат:
Пример SysTime для C#, использующий вызов неуправляемого кода
Значение даты равно 10 31 2006.
См. также
Основные понятия
Маршалинг классов, структур и объединений