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
継承
CallingConvention
属性

フィールド

名前 説明
Winapi 1

このメンバーは実際には呼び出し規約ではなく、 代わりに既定のプラットフォーム呼び出し規則を使用します。

Cdecl 2

呼び出し元がスタックをクリーンアップします。 これにより、 varargsを使用して関数を呼び出し、 Printfなどの可変数のパラメーターを受け入れるメソッドに適しています。

StdCall 3

呼び出し先がスタックをクリーンアップします。

ThisCall 4

最初のパラメーターは this ポインターであり、レジスタ ECX に格納されます。 その他のパラメーターがスタックにプッシュされます。 この呼び出し規則は、アンマネージ DLL からエクスポートされたクラスのメソッドを呼び出すために使用されます。

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

注釈

マネージド コードで呼び出し規則を指定するには、常にCALLCONV列挙型ではなく、CallingConvention列挙体を使用します。 後者は、COM 定義のためにのみ存在します。 CallingConvention列挙は、プラットフォーム呼び出しシグネチャを動的に出力するために、DllImportAttributeおよびSystem.Reflection.Emit内のいくつかのクラスによって使用されます。

適用対象

こちらもご覧ください