Esempio di SysTime
In questo esempio viene dimostrato come passare una classe contenente valori integer a una funzione non gestita per la quale è previsto un puntatore a una struttura.
Nell'esempio di SysTime viene utilizzata la seguente funzione non gestita, illustrata con la dichiarazione di funzione originale:
GetSystemTime esportata da Kernel32.dll.
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
La struttura originale passata alla funzione contiene i seguenti elementi:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
In questo esempio, la classe SystemTime
contiene gli elementi della struttura originale rappresentati come membri di classe. L'attributo StructLayoutAttribute è impostato in modo da garantire che i membri vengano inseriti in memoria in sequenza, nell'ordine in cui appaiono.
La classe LibWrap
contiene un prototipo gestito del metodo GetSystemTime
, che passa la classe SystemTime
come parametro in/out per impostazione predefinita. È necessario dichiarare il parametro con gli attributi InAttribute e OutAttribute poiché le classi, che sono tipi di riferimento, vengono passate come parametri in per impostazione predefinita. Affinché il chiamante riceva i risultati, è necessario applicare questi attributi direzionali in modo esplicito. Con la classe App
si crea una nuova istanza della classe SystemTime
e si accede ai relativi campi di dati.
Il codice sorgente per gli esempi di codice riportati di seguito è fornito dall'Esempio di tecnologia di richiamo piattaforma di .NET Framework.
Dichiarazione dei prototipi
' 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 );
}
Chiamata delle funzioni
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: " );
…
}
}
Vedere anche
Concetti
Marshalling di classi, strutture e unioni
Tipi di dati del richiamo piattaforma
Creazione di prototipi nel codice gestito