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