Compartir a través de


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)

Sintaxis

[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum CallingConvention
[SerializableAttribute]
[ComVisibleAttribute(true)]
public enum class CallingConvention
[<SerializableAttribute>]
[<ComVisibleAttribute(true)>]
type CallingConvention
<SerializableAttribute>
<ComVisibleAttribute(True)>
Public Enumeration CallingConvention

Miembros

Nombre de miembro Descripció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.

Comentarios

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.

Ejemplos

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");
    }
}
Imports System
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices

Public Class LibWrap
' Visual Basic does not 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)> _
Overloads Shared Function printf( _
    ByVal format As String, ByVal i As Integer, ByVal d As Double) As Integer
End Function

<DllImport("msvcrt.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _
Overloads Shared Function printf( _
    ByVal format As String, ByVal i As Integer, ByVal s As String) As Integer
End Function
End Class 'LibWrap

Public Class App
    Public Shared Sub Main()
        LibWrap.printf(ControlChars.CrLf + "Print params: %i %f", 99, _
                       99.99)
        LibWrap.printf(ControlChars.CrLf + "Print params: %i %s", 99, _
                       "abcd")
    End Sub 'Main
End Class 'App
using namespace System;
using namespace System::Runtime::InteropServices;
public ref class LibWrap
{
public:

   // 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)]
   static int printf( String^ format, int i, double d );

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

int main()
{
   LibWrap::printf( "\nPrint params: %i %f", 99, 99.99 );
   LibWrap::printf( "\nPrint params: %i %s", 99, "abcd" );
}

Información de versión

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

Ver también

DllImportAttribute
System.Reflection.Emit
Espacio de nombres System.Runtime.InteropServices

Volver al principio