CallingConvention 列挙体
アンマネージ コードで実装されたメソッドを呼び出すために必要な呼び出し規約を指定します。
<Serializable>
Public Enum CallingConvention
[C#]
[Serializable]
public enum CallingConvention
[C++]
[Serializable]
__value public enum CallingConvention
[JScript]
public
Serializable
enum CallingConvention
解説
マネージ コードで呼び出し規約を指定するときは、 CALLCONV 列挙体ではなく、必ず CallingConvention 列挙体を使用してください。後者は、COM 定義のためだけに存在します。 CallingConvention 列挙体は、プラットフォーム呼び出しシグネチャを動的に出力するために、 DllImportAttribute および System.Reflection.Emit のクラスの一部で使用されます。
メンバ
メンバ名 | 説明 |
---|---|
Cdecl | 呼び出し元がスタックを消去します。これを使用すると、 varargs で関数を呼び出すことができます。 Printf など、受け取るパラメータの数が可変のメソッドで使用します。 |
FastCall | この呼び出し規約はサポートされていません。 |
StdCall | 呼び出し先がスタックを消去します。これは、プラットフォーム呼び出しでアンマネージ関数を呼び出すための既定の規約です。 |
ThisCall | 最初のパラメータは this ポインタで、レジスタ ECX に格納されます。その他のパラメータは、スタックにプッシュされます。この呼び出し規約は、アンマネージ DLL からエクスポートしたクラスのメソッドを呼び出すために使用します。 |
Winapi
.NET Compact Framework でもサポート。 |
このメンバは実際には呼び出し規約ではありません。代わりに、既定のプラットフォーム呼び出し規約を使用します。たとえば、Windows では StdCall 、Windows CE .NET では Cdecl が既定値になります。 |
使用例
[Visual Basic, C#, C++] Cdecl 呼び出し規約を適用する例を次に示します。呼び出し元によってスタックはクリーンアップされるため、これは必ず使用する必要があります。
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", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
format As String, i As Integer, d As Double) As Integer
End Function
<DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
format As String, i As Integer, 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
[C#]
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.Ansi, CallingConvention=CallingConvention.Cdecl)]
public static extern int printf(String format, int i, double d);
[DllImport("msvcrt.dll", CharSet=CharSet.Ansi, 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");
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
public __gc 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]... )
public:
[DllImport(S"msvcrt.dll", CharSet=CharSet::Ansi, CallingConvention=CallingConvention::Cdecl)]
static int printf(String* format, int i, double d);
[DllImport(S"msvcrt.dll", CharSet=CharSet::Ansi, CallingConvention=CallingConvention::Cdecl)]
static int printf(String* format, int i, String* s);
};
int main()
{
LibWrap::printf(S"\nPrint params: %i %f", 99, 99.99);
LibWrap::printf(S"\nPrint params: %i %s", 99, S"abcd");
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Runtime.InteropServices
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)
参照
System.Runtime.InteropServices 名前空間 | DllImportAttribute | System.Reflection.Emit