TypeBuilder.DefinePInvokeMethod メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
PInvoke
メソッドを定義します。
オーバーロード
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
|
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
|
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][], CallingConvention, CharSet) |
|
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
PInvoke
メソッドに名前を指定して、メソッドが定義されている DLL の名前、メソッドの属性、メソッドの呼び出し規則、メソッドの戻り値の型、メソッドのパラメーター型、および PInvoke
フラグを定義します。
public:
System::Reflection::Emit::MethodBuilder ^ DefinePInvokeMethod(System::String ^ name, System::String ^ dllName, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Runtime::InteropServices::CallingConvention nativeCallConv, System::Runtime::InteropServices::CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
member this.DefinePInvokeMethod : string * string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * System.Runtime.InteropServices.CallingConvention * System.Runtime.InteropServices.CharSet -> System.Reflection.Emit.MethodBuilder
Public Function DefinePInvokeMethod (name As String, dllName As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), nativeCallConv As CallingConvention, nativeCharSet As CharSet) As MethodBuilder
パラメーター
- name
- String
PInvoke
メソッドの名前。
name
に埋め込み null 値を含めることはできません。
- dllName
- String
PInvoke
メソッドが定義されている DLL の名前。
- attributes
- MethodAttributes
メソッドの属性。
- callingConvention
- CallingConventions
メソッドの呼び出し規則。
- returnType
- Type
メソッドの戻り値の型。
- parameterTypes
- Type[]
メソッドのパラメーター型。
- nativeCallConv
- CallingConvention
ネイティブ呼び出し規則。
- nativeCharSet
- CharSet
メソッドのネイティブ文字セット。
戻り値
定義された PInvoke
メソッド。
例外
メソッドは静的ではありません。
- または -
親の型がインターフェイスです。
- または -
抽象メソッドです。
- または -
メソッドは以前に定義されています。
- または -
name
または dllName
の長さが 0 です。
name
または dllName
が null
です。
含んでいる型が CreateType() を使用して以前に作成されています。
例
次の例では、 メソッドをDefinePInvokeMethod使用してメソッドを作成PInvoke
する方法と、 メソッドと メソッドを使用して、 を作成MethodBuilderした後で メソッド実装フラグにフラグを追加MethodImplAttributes.PreserveSigする方法をMethodBuilder.GetMethodImplementationFlagsMethodBuilder.SetImplementationFlags示します。
重要
0 以外の戻り値を取得するには、 フラグを追加する MethodImplAttributes.PreserveSig 必要があります。
この例では、 メソッドを含む 1 つの動的モジュールと 1 つの型 MyType
を持つ動的アセンブリを PInvoke
作成します。 メソッドは PInvoke
Win32 GetTickCount
関数を表します。
この例を実行すると、 メソッドが実行されます PInvoke
。 また、動的アセンブリを PInvokeTest.dll として保存します。
Ildasm.exe (IL 逆アセンブラー) を使用して、クラスとそのstatic
クラスに含まれる (Shared
Visual Basic の ) PInvoke
メソッドを調べることができますMyType
。 静的メソッドを使用 MyType.GetTickCount
する Visual Basic または C# プログラムをコンパイルするには、csc.exe または vbc.exe の実行時に DLL への参照を含めます (例: /r:PInvokeTest.dll
)。
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
CallingConvention::Winapi,
CharSet::Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
CallingConvention.Winapi,
CharSet.Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
CallingConvention.Winapi, _
CharSet.Ansi)
' Add PreserveSig to the method implementation flags. NOTE: If this line
' is commented out, the return value will be zero when the method is
' invoked.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
注釈
一部の DLL インポート属性 (の DllImportAttribute説明を参照) は、このメソッドの引数として指定できません。 たとえば、 メソッドが値を返す場合は、 メソッドのPInvoke
作成後に DLL インポート属性MethodImplAttributes.PreserveSigを追加する必要があります。 この例では、これを行う方法を示します。
適用対象
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
PInvoke
メソッドに名前を指定して、メソッドが定義されている DLL の名前、エントリ ポイント名、メソッドの属性、メソッドの呼び出し規約、メソッドの戻り値の型、メソッドのパラメーター型、および PInvoke
フラグを定義します。
public:
System::Reflection::Emit::MethodBuilder ^ DefinePInvokeMethod(System::String ^ name, System::String ^ dllName, System::String ^ entryName, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Runtime::InteropServices::CallingConvention nativeCallConv, System::Runtime::InteropServices::CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
member this.DefinePInvokeMethod : string * string * string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * System.Runtime.InteropServices.CallingConvention * System.Runtime.InteropServices.CharSet -> System.Reflection.Emit.MethodBuilder
Public Function DefinePInvokeMethod (name As String, dllName As String, entryName As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), nativeCallConv As CallingConvention, nativeCharSet As CharSet) As MethodBuilder
パラメーター
- name
- String
PInvoke
メソッドの名前。
name
に埋め込み null 値を含めることはできません。
- dllName
- String
PInvoke
メソッドが定義されている DLL の名前。
- entryName
- String
DLL 内のエントリ ポイントの名前。
- attributes
- MethodAttributes
メソッドの属性。
- callingConvention
- CallingConventions
メソッドの呼び出し規則。
- returnType
- Type
メソッドの戻り値の型。
- parameterTypes
- Type[]
メソッドのパラメーター型。
- nativeCallConv
- CallingConvention
ネイティブ呼び出し規則。
- nativeCharSet
- CharSet
メソッドのネイティブ文字セット。
戻り値
定義された PInvoke
メソッド。
例外
メソッドは静的ではありません。
- または -
親の型がインターフェイスです。
- または -
抽象メソッドです。
- または -
メソッドは以前に定義されています。
- または -
name
、dllName
、または entryName
の長さが 0 です。
name
、dllName
、または entryName
が null
です。
含んでいる型が CreateType() を使用して以前に作成されています。
例
次のコード例では、 メソッドをDefinePInvokeMethod使用して メソッドを作成PInvoke
する方法と、 メソッドと メソッドを使用して、 を作成MethodBuilderした後で メソッド実装フラグに フラグをMethodBuilder.GetMethodImplementationFlagsMethodBuilder.SetImplementationFlags追加MethodImplAttributes.PreserveSigする方法を示します。
重要
0 以外の戻り値を取得するには、 フラグを追加する MethodImplAttributes.PreserveSig 必要があります。
この例では、 メソッドを含む 1 つの動的モジュールと 1 つの型 MyType
を持つ動的アセンブリを PInvoke
作成します。 メソッドは PInvoke
Win32 GetTickCount
関数を表します。
この例を実行すると、 メソッドが実行されます PInvoke
。 また、動的アセンブリを PInvokeTest.dll として保存します。
Ildasm.exe (IL 逆アセンブラー) を使用して、クラスとそのstatic
クラスに含まれる (Shared
Visual Basic の ) PInvoke
メソッドを調べることができますMyType
。 静的メソッドを使用 MyType.GetTickCount
する Visual Basic または C# プログラムをコンパイルするには、csc.exe または vbc.exe の実行時に DLL への参照を含めます (例: /r:PInvokeTest.dll
)。
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
CallingConvention::Winapi,
CharSet::Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
CallingConvention.Winapi,
CharSet.Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
CallingConvention.Winapi, _
CharSet.Ansi)
' Add PreserveSig to the method implementation flags. NOTE: If this line
' is commented out, the return value will be zero when the method is
' invoked.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
注釈
一部の DLL インポート属性 (の DllImportAttribute説明を参照) は、このメソッドの引数として指定できません。 たとえば、 メソッドが値を返す場合は、 メソッドのPInvoke
作成後に DLL インポート属性MethodImplAttributes.PreserveSigを追加する必要があります。 この例では、これを行う方法を示します。
適用対象
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][], CallingConvention, CharSet)
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
- ソース:
- TypeBuilder.cs
PInvoke
メソッドを定義します。名前、メソッドが定義されている DLL の名前、エントリ ポイント名、メソッドの属性、メソッドの呼び出し規則、メソッドの戻り値の型、メソッドのパラメーター型、PInvoke
フラグ、およびパラメーターと戻り値の型のカスタム修飾子を指定します。
public:
System::Reflection::Emit::MethodBuilder ^ DefinePInvokeMethod(System::String ^ name, System::String ^ dllName, System::String ^ entryName, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ returnTypeRequiredCustomModifiers, cli::array <Type ^> ^ returnTypeOptionalCustomModifiers, cli::array <Type ^> ^ parameterTypes, cli::array <cli::array <Type ^> ^> ^ parameterTypeRequiredCustomModifiers, cli::array <cli::array <Type ^> ^> ^ parameterTypeOptionalCustomModifiers, System::Runtime::InteropServices::CallingConvention nativeCallConv, System::Runtime::InteropServices::CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers, Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
public System.Reflection.Emit.MethodBuilder DefinePInvokeMethod (string name, string dllName, string entryName, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
member this.DefinePInvokeMethod : string * string * string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type[] * Type[] * Type[][] * Type[][] * System.Runtime.InteropServices.CallingConvention * System.Runtime.InteropServices.CharSet -> System.Reflection.Emit.MethodBuilder
Public Function DefinePInvokeMethod (name As String, dllName As String, entryName As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, returnTypeRequiredCustomModifiers As Type(), returnTypeOptionalCustomModifiers As Type(), parameterTypes As Type(), parameterTypeRequiredCustomModifiers As Type()(), parameterTypeOptionalCustomModifiers As Type()(), nativeCallConv As CallingConvention, nativeCharSet As CharSet) As MethodBuilder
パラメーター
- name
- String
PInvoke
メソッドの名前。
name
に埋め込み null 値を含めることはできません。
- dllName
- String
PInvoke
メソッドが定義されている DLL の名前。
- entryName
- String
DLL 内のエントリ ポイントの名前。
- attributes
- MethodAttributes
メソッドの属性。
- callingConvention
- CallingConventions
メソッドの呼び出し規則。
- returnType
- Type
メソッドの戻り値の型。
- returnTypeRequiredCustomModifiers
- Type[]
メソッドの戻り値の型の IsConstなど、必須のカスタム修飾子を表す型の配列。 戻り値の型が必須のカスタム修飾子を持たない場合は、null
を指定します。
- returnTypeOptionalCustomModifiers
- Type[]
メソッドの戻り値の型の IsConst のような、省略可能なカスタム修飾子を表す型の配列。 戻り値の型に省略可能のカスタム修飾子がない場合は、null
を指定します。
- parameterTypes
- Type[]
メソッドのパラメーター型。
- parameterTypeRequiredCustomModifiers
- Type[][]
型の配列の配列。 型の各配列は、IsConst のような、対応するパラメーターの必須のカスタム修飾子を表します。 特定のパラメーターに必須のカスタム修飾子がない場合は、型の配列の代わりに null
を指定します。 どのパラメーターにも必須のカスタム修飾子がない場合は、配列の配列の代わりに null
を指定します。
- parameterTypeOptionalCustomModifiers
- Type[][]
型の配列の配列。 型の各配列は、 IsConstのような、対応するパラメーターの省略可能なカスタム修飾子を表します。 特定のパラメーターに省略可能なカスタム修飾子がない場合は、型の配列の代わりに null
を指定します。 どのパラメーターにも省略可能なカスタム修飾子がない場合は、配列の配列の代わりに null
を指定します。
- nativeCallConv
- CallingConvention
ネイティブ呼び出し規則。
- nativeCharSet
- CharSet
メソッドのネイティブ文字セット。
戻り値
定義された PInvoke
メソッドを表す MethodBuilder。
例外
メソッドは静的ではありません。
- または -
親の型がインターフェイスです。
- または -
抽象メソッドです。
- または -
メソッドは以前に定義されています。
- または -
name
、dllName
、または entryName
の長さが 0 です。
- または -
parameterTypeRequiredCustomModifiers
または parameterTypeOptionalCustomModifiers
のサイズは parameterTypes
のサイズと同じではありません。
name
、dllName
、または entryName
が null
です。
型は CreateType() を使用して既に作成されました。
- または -
現在の動的な型では、IsGenericType プロパティは true
ですが、IsGenericTypeDefinition プロパティは false
です。
例
次のコード例では、 メソッドをDefinePInvokeMethod使用して メソッドを作成PInvoke
する方法と、 メソッドと メソッドを使用して、 を作成MethodBuilderした後で メソッド実装フラグに フラグをMethodBuilder.GetMethodImplementationFlagsMethodBuilder.SetImplementationFlags追加MethodImplAttributes.PreserveSigする方法を示します。
この例では、 メソッドを含む 1 つの動的モジュールと 1 つの型 MyType
を持つ動的アセンブリを PInvoke
作成します。 メソッドは PInvoke
Win32 GetTickCount
関数を表します。
重要
0 以外の戻り値を取得するには、 フラグを追加する MethodImplAttributes.PreserveSig 必要があります。
注意
この例では、カスタム修飾子を指定しないオーバーロードを使用します。 カスタム修飾子を指定するには、代わりにこのメソッド オーバーロードを使用するようにコード例を変更します。
この例を実行すると、 メソッドが実行されます PInvoke
。 また、動的アセンブリを PInvokeTest.dll として保存します。
Ildasm.exe (IL 逆アセンブラー) を使用して、クラスとそのstatic
クラスに含まれる (Shared
Visual Basic の ) PInvoke
メソッドを調べることができますMyType
。 静的メソッドを使用 MyType.GetTickCount
する Visual Basic または C# プログラムをコンパイルするには、csc.exe または vbc.exe の実行時に DLL への参照を含めます (例: /r:PInvokeTest.dll
)。
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
CallingConvention::Winapi,
CharSet::Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
CallingConvention.Winapi,
CharSet.Ansi);
// Add PreserveSig to the method implementation flags. NOTE: If this line
// is commented out, the return value will be zero when the method is
// invoked.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
CallingConvention.Winapi, _
CharSet.Ansi)
' Add PreserveSig to the method implementation flags. NOTE: If this line
' is commented out, the return value will be zero when the method is
' invoked.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
注釈
一部の DLL インポート属性 (の DllImportAttribute説明を参照) は、このメソッドの引数として指定できません。 たとえば、 メソッドが値を返す場合は、 メソッドのPInvoke
作成後に DLL インポート属性MethodImplAttributes.PreserveSigを追加する必要があります。 この例では、これを行う方法を示します。
注意
カスタム修飾子の詳細については、「ECMA C#」および「共通言語インフラストラクチャ標準」および「Standard ECMA-335 - 共通言語インフラストラクチャ (CLI)」を参照してください。
適用対象
.NET