CallingConvention Enumeração

Definição

Especifica a convenção de chamada necessária para chamar os métodos implementados em código não gerenciado.

public enum CallingConvention
[System.Serializable]
public enum CallingConvention
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum CallingConvention
Herança
CallingConvention
Atributos

Campos

Cdecl 2

O chamador limpa a pilha. Isso permite chamar funções com varargs, o que o torna apropriado para usar para métodos que aceitam um número variável de parâmetros, como Printf.

FastCall 5

Não há suporte para essa convenção de chamada.

StdCall 3

O computador chamado limpa a pilha.

ThisCall 4

O primeiro parâmetro é o ponteiro this e é armazenado no ECX de registro. Outros parâmetros são enviados por push na pilha. Esta convenção de chamada é usada para chamar métodos em classes exportadas de uma DLL não gerenciada.

Winapi 1

Esse membro não é realmente uma convenção de chamada, mas usa a convenção de chamada de plataforma padrão.

Exemplos

O exemplo a seguir demonstra como aplicar a Cdecl convenção de chamada, que você deve usar porque a pilha é limpa pelo chamador.

using System;
using System.Runtime.InteropServices;

internal static class NativeMethods
{
    // 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)]
    internal static extern int printf(String format, int i, double d);

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

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

Comentários

Sempre use a CallingConvention enumeração em vez da CALLCONV enumeração para especificar uma convenção de chamada no código gerenciado. Este último existe apenas para fins de definições COM. A CallingConvention enumeração é usada por DllImportAttribute e várias classes no System.Reflection.Emit para emitir assinaturas de invocação de plataforma dinamicamente.

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também