CallingConvention Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает соглашение о вызове, необходимое для вызова методов, реализованных в неуправляемом коде.
public enum class CallingConvention
public enum CallingConvention
[System.Serializable]
public enum CallingConvention
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum CallingConvention
type CallingConvention =
[<System.Serializable>]
type CallingConvention =
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CallingConvention =
Public Enum CallingConvention
- Наследование
- Атрибуты
Поля
| Имя | Значение | Описание |
|---|---|---|
| Winapi | 1 | Этот член на самом деле не является соглашением о вызовах, но вместо этого использует соглашение о вызовах платформы по умолчанию. |
| Cdecl | 2 | Вызывающий объект очищает стек. Это позволяет вызывать функции с |
| StdCall | 3 | Вызывающий объект очищает стек. |
| ThisCall | 4 | Первый параметр — |
| FastCall | 5 | Это соглашение о вызовах не поддерживается. |
Примеры
В следующем примере показано, как применить Cdecl соглашение о вызовах, которое необходимо использовать, так как стек очищается вызывающим оператором.
using namespace System;
using namespace System::Runtime::InteropServices;
private ref class NativeMethods
{
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()
{
NativeMethods::printf("\nPrint params: %i %f", 99, 99.99);
NativeMethods::printf("\nPrint params: %i %s", 99, "abcd");
}
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");
}
}
Imports System.Runtime.InteropServices
Friend Class NativeMethods
' 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)>
Friend 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)>
Friend Overloads Shared Function printf(
ByVal format As String, ByVal i As Integer, ByVal s As String) As Integer
End Function
End Class
Public Class App
Public Shared Sub Main()
NativeMethods.printf(ControlChars.CrLf + "Print params: %i %f", 99, 99.99)
NativeMethods.printf(ControlChars.CrLf + "Print params: %i %s", 99, "abcd")
End Sub
End Class
Комментарии
Всегда используйте CallingConvention перечисление, а не CALLCONV перечисление, чтобы указать соглашение о вызове в управляемом коде. Последний существует только для определения COM. Перечисление CallingConvention используется несколькими классами DllImportAttribute для System.Reflection.Emit динамического вызова подписей платформы.