Esempio di tecnologia di richiamo piattaforma

Aggiornamento: novembre 2007

In questo esempio vengono illustrate le tecniche utilizzate per chiamare le funzioni esportate da una libreria non gestita. In particolare viene illustrato come:

  • Dichiarare tipi diversi

  • Utilizzare gli attributi disponibili per modificare il comportamento predefinito

  • Utilizzare i metodi del tipo Marshal

  • Determinare gli aspetti della Garbage Collection e del modello di threading che possono influire sui risultati.

In alcuni esempi vengono utilizzate funzioni esportate da librerie Windows mentre in altri vengono utilizzate funzioni esportate da una libreria personalizzata. È possibile che le librerie utilizzate in alcuni esempi non siano disponibili su tutte le piattaforme Windows o che le funzioni non siano supportate in tutte le piattaforme Windows. Questo problema, comunque, non impedirà di comprendere le specifiche regole di richiamo piattaforma utilizzate in un esempio.

Di seguito è indicata la struttura di directory utilizzata negli esempi.

Directory

Contenuto

WinAPIs

Dimostrazione della tecnologia di richiamo piattaforma mediante l'utilizzo di funzioni esportate da librerie Windows.

WinAPIs\CS

File di origine scritti in C#.

WinAPIs\VB

File di origine scritti in Visual Basic.

Personalizzato

Dimostrazione della tecnologia di richiamo piattaforma mediante l'utilizzo di funzioni esportate da una libreria dei tipi personalizzata.

Custom\CS

File di origine scritti in C#.

Custom\LIB

File di origine della libreria dei tipi personalizzata.

Custom\VB

File di origine scritti in VB.

Per informazioni sull'utilizzo degli esempi, vedere i seguenti argomenti:

Download sample

Per compilare gli esempi utilizzando il prompt dei comandi

  1. Aprire una finestra del prompt dei comandi, quindi spostarsi in una delle sottodirectory specifiche del linguaggio.

  2. Digitare msbuild [nome file].sln dalla riga di comando.

    Nota:

    Gli esempi di richiamo piattaforma mediante funzioni di una libreria dei tipi personalizzata possono essere compilati soltanto utilizzando Visual Studio.

Per compilare gli esempi utilizzando Visual Studio

  1. Aprire Esplora risorse, quindi spostarsi in una delle sottodirectory specifiche del linguaggio.

  2. Fare doppio clic sull'icona relativa a [nome file].sln per aprire il file in Visual Studio.

  3. Scegliere Compila soluzione dal menu Compila.

Per eseguire gli esempi

  1. Spostarsi in una delle directory specifiche del linguaggio della directory WinAPIs o Custom contenente gli eseguibili compilati.

  2. Digitare il nome del file eseguibile dalla riga di comando.

    Nota:

    L'esempio compila applicazioni console. Per visualizzare l'output delle applicazioni, è necessario avviarle separatamente dalla finestra del prompt dei comandi.

Requisiti

Per questi esempi sono necessari i file di intestazione di Windows, che sono disponibili per il progetto se questo viene compilato mediante Microsoft Visual Studio 2005 o il prompt dei comandi di Visual Studio 2005 oppure se Platform SDK è installato e specificato in un percorso di inclusione.

Osservazioni

Nelle tabelle riportate di seguito viene fornita una breve descrizione degli argomenti illustrati negli esempi e sono elencati i percorsi dei file di origine degli esempi relativi all'argomento specifico.

Utilizzo degli attributi di richiamo piattaforma

Attributo

Descrizione

Esempio

EntryPoint

Rinomina una funzione da utilizzare in codice gestito.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CharSet

Specifica come eseguire il marshalling delle stringhe e influisce sui criteri di ricerca dei nomi di funzione.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

ExactSpelling

Indica se il nome del punto di ingresso nella DLL non gestita deve essere modificato in modo che corrisponda al valore di CharSet.

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CallingConvention

Chiama le funzioni con varargs.

WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb

PreserveSig

Modifica le funzioni che restituiscono i valori HRESULT.

WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb

SetLastError

Garantisce che il codice di errore venga salvato dopo una chiamata di funzione.

WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb

Esecuzione del marshalling di strutture e unioni

Tipo

Descrizione

Esempio

Struttura ByVal

Passa una struttura come parametro in.

Custom\CS\Structs.cs Custom\VB\Structs.vb

Struttura ByRef

Passa una struttura come parametro in/out.

WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb

Classe ByVal

Passa una classe contenente soltanto membri integer come parametro in/out.

WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb

Struttura con strutture nidificate (semplificata)

Genera una classe che rappresenta una struttura con strutture nidificate sul lato non gestito. La struttura viene semplificata in una struttura di grandi dimensioni sul lato gestito.

WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb

Struttura con strutture nidificate (non semplificata)

Passa una struttura con una struttura incorporata.

Custom\CS\Structs.cs Custom\VB\Structs.vb

Struttura contenente un puntatore a un'altra struttura

Passa una struttura che contiene un puntatore a un'altra struttura come membro.

Custom\CS\Structs.cs Custom\VB\Structs.vb

Matrice di strutture contenenti soltanto valori integer ByVal

Passa una matrice di strutture che contengono solo valori integer come parametro in/out.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

Matrice di strutture contenenti valori integer e stringhe ByRef

Passa una matrice di strutture che contengono valori integer e stringhe come parametro out. La memoria per la matrice viene allocata dal chiamato.

Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb

Unioni con tipi di valore

Passa un'unione con tipi di valore (integer e double).

Custom\CS\Unions.cs Custom\VB\Unions.vb

Unioni con tipi misti

Passa un'unione con tipi misti (integer e string).

Custom\CS\Unions.cs Custom\VB\Unions.vb

Esecuzione del marshalling di matrici

Matrice

Descrizione

Esempio

Matrice di valori integer ByVal

Passa una matrice di valori integer come parametro in/out.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

Matrice di valori integer ByRef

Passa una matrice di valori integer come parametro in/out. La matrice può essere ridimensionata.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

Matrice bidimensionale di valori integer ByVal

Passa una matrice bidimensionale di integer come parametro in/out.

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

Varie

Tipo di elemento

Descrizione

Esempio

HandleRef

Viene presentato un caso in cui è necessario utilizzare HandleRef per impedire l'esecuzione della Garbage Collection.

WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb

Puntatori a funzione

Passano un delegato a una funzione non gestita per la quale è previsto un puntatore a funzione.

Custom\CS\Callback.cs Custom\VB\Callback.vb

void*

Chiama una funzione il cui parametro è void*.

Custom\CS\Void.cs Custom\VB\Void.vb

LPARAM

Utilizza GCHandle per passare un oggetto gestito a una funzione non gestita che prevede LPARAM.

WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb

Apartment a thread singolo (STA)/Apartment con multithreading (MTA)

Modifica le impostazioni di apartment predefinite quando una funzione non gestita chiama CoInitialize.

WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb

Per ulteriori informazioni sul richiamo piattaforma, vedere i commenti nei file di codice sorgente.

Vedere anche

Concetti

Utilizzo di funzioni di DLL non gestite

Esempi di richiamo piattaforma

Riferimenti

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

Altre risorse

Comportamento di marshalling predefinito

Marshalling dei dati con richiamo piattaforma