Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Enumeración CallingConvention

 

Publicado: octubre de 2016

Especifica la convención de llamada necesaria para llamar a métodos implementados en el código no administrado.

Espacio de nombres:   System.Runtime.InteropServices
Ensamblado:  mscorlib (en mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum CallingConvention

Nombre de miembroDescripción
Cdecl

El llamador limpia la pila. Esto permite llamar a funciones con varargs, que resulta apropiado para métodos que aceptan un número variable de parámetros, como Printf.

FastCall

No se admite esta convención de llamada.

StdCall

El destinatario limpia la pila. Esta es la convención predeterminada para llamar a funciones no administradas con platform invoke.

ThisCall

El primer parámetro es el this puntero y se almacena en el registro ECX. Otros parámetros se insertan en la pila. Esta convención de llamada se usa para llamar a métodos en clases exportadas desde una DLL no administrada.

Winapi

Este miembro no es realmente una convención de llamada, pero en su lugar utiliza la convención de llamada de plataforma predeterminada. Por ejemplo, en Windows, el valor predeterminado es StdCall y en Windows CE.NET es Cdecl.

Utilice siempre la CallingConvention enumeración en lugar de CALLCONV enumeración para especificar una convención de llamada en código administrado. Esto último sólo existe para las definiciones COM. El CallingConvention utiliza enumeración DllImportAttribute y varias clases de System.Reflection.Emit dinámicamente emitir firmas de invocación de plataforma.

En el ejemplo siguiente se muestra cómo aplicar el Cdecl convención de llamada, que debe utilizarse porque el llamador limpia la pila.

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");
    }
}

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: