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