Espandi Riduci a icona
Il presente articolo è stato tradotto manualmente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Enumerazione CallingConvention

Specifica la convenzione di chiamata necessaria per chiamare i metodi implementati nel codice non gestito.

Spazio dei nomi:  System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)
[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum CallingConvention
Nome membroDescrizione
Supportato da XNA FrameworkWinapiIn realtà il membro non è una convenzione di chiamata, ma utilizza la convenzione predefinita per le chiamate al sistema operativo. In Windows, ad esempio, l'impostazione predefinita è StdCall, mentre in Windows CE .NET è Cdecl.
CdeclIl chiamante pulisce lo stack. Questa operazione attiva funzioni di chiamata con varargs, pertanto è adatta ad essere utilizzata per metodi che accettano un numero variabile di parametri, ad esempio Printf.
StdCallIl chiamato esegue la pulizia dello stack. Si tratta della convenzione predefinita per chiamare le funzioni non gestite con chiamata al sistema operativo.
ThisCallIl primo parametro è il puntatore this ed è memorizzato in ECX del registro di sistema. Altri parametri vengono inseriti nello stack. Questa convenzione di chiamata viene utilizzata per chiamare metodi su classi esportate da una DLL non gestita.
FastCallQuesta convenzione di chiamata non è supportata.

Utilizzare sempre l'enumerazione CallingConvention anziché l'enumerazione CALLCONV per specificare una convenzione di chiamata in codice gestito. Quest'ultima esiste solo per esigenze delle definizioni COM. L'enumerazione CallingConvention viene utilizzata da DllImportAttribute e da diverse classi in System.Reflection.Emit per creare in modo dinamico firme di chiamata al sistema operativo.

Nell'esempio che segue viene illustrato come applicare la convenzione di chiamata Cdecl che è necessario utilizzare, poiché lo stack è stato pulito dal chiamante.


using System;
using System.Runtime.InteropServices;

public class LibWrap
{
// C# doesn't support varargs so all arguments must be explicitly defined.
// CallingConvention.Cdecl must be used since the stack is 
// cleaned up by the caller.

// int printf( const char *format [, argument]... )

[DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
public static extern int printf(String format, int i, double d); 

[DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
public static extern int printf(String format, int i, String s); 
}

public class App
{
    public static void Main()
    {
        LibWrap.printf("\nPrint params: %i %f", 99, 99.99);
        LibWrap.printf("\nPrint params: %i %s", 99, "abcd");
    }
}


.NET Framework

Supportato in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 o versione successiva, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (componenti di base del server non supportati), Windows Server 2008 R2 (componenti di base del server supportati con SP1 o versione successiva), Windows Server 2003 SP2

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
© 2013 Microsoft. Tutti i diritti riservati.