ModuleBuilder.DefinePInvokeMethod Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Definiert eine PInvoke
-Methode.
Überlädt
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definiert eine |
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definiert eine |
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- Quelle:
- ModuleBuilder.cs
- Quelle:
- ModuleBuilder.cs
- Quelle:
- ModuleBuilder.cs
Definiert eine PInvoke
-Methode mit den Angaben für den Namen, den Namen der DLL, in der die Methode definiert ist, für die Attribute der Methode, die Aufrufkonvention der Methode, den Rückgabetyp der Methode, die Parametertypen der Methode und die PInvoke
-Flags.
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
Parameter
- name
- String
Der Name der PInvoke
-Methode.
name
darf keine eingebetteten NULL-Werte enthalten.
- dllName
- String
Der Name der DLL, in der die PInvoke
-Methode definiert ist.
- attributes
- MethodAttributes
Die Attribute der Methode.
- callingConvention
- CallingConventions
Die Aufrufkonvention der Methode.
- returnType
- Type
Der Rückgabetyp der Methode.
- parameterTypes
- Type[]
Die Typen der Parameter der Methode.
- nativeCallConv
- CallingConvention
Die systemeigene Aufrufkonvention.
- nativeCharSet
- CharSet
Der systemeigene Zeichensatz der Methode.
Gibt zurück
Die definierte PInvoke
-Methode.
Ausnahmen
Die Methode ist nicht statisch, wenn der enthaltende Typ eine Schnittstelle ist.
- oder -
Die Methode ist abstrakt.
- oder -
Die Methode wurde bereits definiert.
name
oder dllName
ist null
.
Der enthaltende Typ wurde bereits mit CreateType() erstellt.
Beispiele
Im folgenden Beispiel wird die Verwendung der DefinePInvokeMethod
-Methode veranschaulicht, um eine für eine MethodBuilder externe nicht verwaltete Methode ( MessageBoxA
) in der Windows-API zu erstellen. Im Beispiel wird ein Meldungsfeld mit den Schaltflächen "Wiederholen " und "Abbrechen " und der Rückgabewert aus dem Meldungsfeld angezeigt.
Wichtig
Um einen Rückgabewert ungleich Null zu erhalten, müssen Sie den Methodenimplementierungsflags hinzufügenMethodImplAttributes.PreserveSig, nachdem Sie die MethodBuilder- und MethodBuilder.SetImplementationFlags -MethodBuilder.GetMethodImplementationFlagsMethode erstellt haben.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
const int MB_RETRYCANCEL = 5;
void main()
{
AssemblyName^ myAssemblyName = gcnew AssemblyName("TempAssembly");
// Define a dynamic assembly in the current application domain.
AssemblyBuilder^ myAssemblyBuilder =
AppDomain::CurrentDomain->DefineDynamicAssembly(
myAssemblyName, AssemblyBuilderAccess::Run);
// Define a dynamic module in "TempAssembly" assembly.
ModuleBuilder^ myModuleBuilder =
myAssemblyBuilder->DefineDynamicModule("TempModule");
array<Type^>^ paramTypes =
{ int::typeid, String::typeid, String::typeid, int::typeid };
// Define a PInvoke method.
MethodBuilder^ piMethodBuilder = myModuleBuilder->DefinePInvokeMethod(
"MessageBoxA",
"user32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
paramTypes,
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.
piMethodBuilder->SetImplementationFlags(
piMethodBuilder->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// Create global methods.
myModuleBuilder->CreateGlobalFunctions();
// Arguments for calling the method.
array<Object^>^ arguments =
{ (Object^)(int) 0, "Hello World", "Title", MB_RETRYCANCEL };
MethodInfo^ pinvokeMethod = myModuleBuilder->GetMethod("MessageBoxA");
Console::WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...");
Console::WriteLine("Message box returned: {0}",
pinvokeMethod->Invoke(nullptr, arguments));
};
/* This code example produces input similar to the following:
Testing module-level PInvoke method created with DefinePInvokeMethod...
Message box returned: 4
*/
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace PInvoke
{
public class Example
{
const int MB_RETRYCANCEL = 5;
static void Main()
{
AssemblyName myAssemblyName = new AssemblyName("TempAssembly");
// Define a dynamic assembly in the current application domain.
AssemblyBuilder myAssemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
myAssemblyName, AssemblyBuilderAccess.Run);
// Define a dynamic module in "TempAssembly" assembly.
ModuleBuilder myModuleBuilder =
myAssemblyBuilder.DefineDynamicModule("TempModule");
Type[] paramTypes = { typeof(int), typeof(string), typeof(string), typeof(int) };
// Define a PInvoke method.
MethodBuilder piMethodBuilder = myModuleBuilder.DefinePInvokeMethod(
"MessageBoxA",
"user32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
paramTypes,
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.
piMethodBuilder.SetImplementationFlags(
piMethodBuilder.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// Create global methods.
myModuleBuilder.CreateGlobalFunctions();
// Arguments for calling the method.
Object[] arguments = { 0, "Hello World", "Title", MB_RETRYCANCEL };
MethodInfo pinvokeMethod = myModuleBuilder.GetMethod("MessageBoxA");
Console.WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...");
Console.WriteLine("Message box returned: {0}",
pinvokeMethod.Invoke(null, arguments));
}
}
}
/* This code example produces input similar to the following:
Testing module-level PInvoke method created with DefinePInvokeMethod...
Message box returned: 4
*/
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Namespace PInvoke
Public Class Example
Const MB_RETRYCANCEL As Integer = 5
Shared Sub Main()
Dim myAssemblyName As New AssemblyName("TempAssembly")
' Define a dynamic assembly in the current application domain.
Dim myAssemblyBuilder As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly( _
myAssemblyName, AssemblyBuilderAccess.Run)
' Define a dynamic module in "TempAssembly" assembly.
Dim myModuleBuilder As ModuleBuilder = _
myAssemblyBuilder.DefineDynamicModule("TempModule")
Dim paramTypes() As Type = _
{ GetType(Integer), GetType(string), GetType(string), GetType(Integer) }
' Define a PInvoke method.
Dim piMethodBuilder As MethodBuilder = myModuleBuilder.DefinePInvokeMethod( _
"MessageBoxA", _
"user32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
paramTypes, _
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.
piMethodBuilder.SetImplementationFlags( _
piMethodBuilder.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' Create global methods.
myModuleBuilder.CreateGlobalFunctions()
' Arguments for calling the method.
Dim arguments() As Object= { 0, "Hello World", "Title", MB_RETRYCANCEL }
Dim pinvokeMethod As MethodInfo = _
myModuleBuilder.GetMethod("MessageBoxA")
Console.WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...")
Console.WriteLine("Message box returned: {0}", _
pinvokeMethod.Invoke(Nothing, arguments))
End Sub
End Class
End Namespace
' This code example produces input similar to the following:
'
'Testing module-level PInvoke method created with DefinePInvokeMethod...
'Message box returned: 4
Hinweise
Einige DLL-Importattribute (siehe Beschreibung von System.Runtime.InteropServices.DllImportAttribute) können nicht als Argumente für diese Methode angegeben werden. Solche Attribute sollten durch Ausgeben eines benutzerdefinierten Attributs für die -Methode festgelegt werden. Beispielsweise wird das DLL-Import-Attribut PreserveSig
festgelegt, indem ein benutzerdefiniertes Attribut ausgibt.
Hinweis
Ab dem .NET Framework 2.0 Service Pack 1 benötigt ReflectionPermission dieses Mitglied nicht mehr das ReflectionPermissionFlag.ReflectionEmit Flag. (Siehe Sicherheitsprobleme in Reflection Emit.) Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher abzielen.
Gilt für:
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- Quelle:
- ModuleBuilder.cs
- Quelle:
- ModuleBuilder.cs
- Quelle:
- ModuleBuilder.cs
Definiert eine PInvoke
-Methode mit den Angaben für den Namen, den Namen der DLL, in der die Methode definiert ist, für die Attribute der Methode, die Aufrufkonvention der Methode, den Rückgabetyp der Methode, die Parametertypen der Methode und die PInvoke
-Flags.
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
Parameter
- name
- String
Der Name der PInvoke
-Methode.
name
darf keine eingebetteten NULL-Werte enthalten.
- dllName
- String
Der Name der DLL, in der die PInvoke
-Methode definiert ist.
- entryName
- String
Der Name des Einstiegspunkts in die DLL.
- attributes
- MethodAttributes
Die Attribute der Methode.
- callingConvention
- CallingConventions
Die Aufrufkonvention der Methode.
- returnType
- Type
Der Rückgabetyp der Methode.
- parameterTypes
- Type[]
Die Typen der Parameter der Methode.
- nativeCallConv
- CallingConvention
Die systemeigene Aufrufkonvention.
- nativeCharSet
- CharSet
Der systemeigene Zeichensatz der Methode.
Gibt zurück
Die definierte PInvoke
-Methode.
Ausnahmen
Die Methode ist nicht statisch, der enthaltende Typ ist eine Schnittstelle, die Methode ist abstrakt, oder die Methode wurde bereits definiert.
name
oder dllName
ist null
.
Der enthaltende Typ wurde bereits mit CreateType() erstellt.
Beispiele
Im folgenden Beispiel wird die Verwendung der DefinePInvokeMethod
-Methode veranschaulicht, um eine für eine MethodBuilder externe nicht verwaltete Methode ( MessageBoxA
) in der Windows-API zu erstellen. Im Beispiel wird ein Meldungsfeld mit den Schaltflächen "Wiederholen " und "Abbrechen " und der Rückgabewert aus dem Meldungsfeld angezeigt.
Wichtig
Um einen Rückgabewert ungleich Null zu erhalten, müssen Sie den Methodenimplementierungsflags hinzufügenMethodImplAttributes.PreserveSig, nachdem Sie die MethodBuilder- und MethodBuilder.SetImplementationFlags -MethodBuilder.GetMethodImplementationFlagsMethode erstellt haben.
In diesem Beispiel wird eine andere Überladung der DefinePInvokeMethod -Methode verwendet, aber die Technik ist identisch.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
const int MB_RETRYCANCEL = 5;
void main()
{
AssemblyName^ myAssemblyName = gcnew AssemblyName("TempAssembly");
// Define a dynamic assembly in the current application domain.
AssemblyBuilder^ myAssemblyBuilder =
AppDomain::CurrentDomain->DefineDynamicAssembly(
myAssemblyName, AssemblyBuilderAccess::Run);
// Define a dynamic module in "TempAssembly" assembly.
ModuleBuilder^ myModuleBuilder =
myAssemblyBuilder->DefineDynamicModule("TempModule");
array<Type^>^ paramTypes =
{ int::typeid, String::typeid, String::typeid, int::typeid };
// Define a PInvoke method.
MethodBuilder^ piMethodBuilder = myModuleBuilder->DefinePInvokeMethod(
"MessageBoxA",
"user32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
paramTypes,
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.
piMethodBuilder->SetImplementationFlags(
piMethodBuilder->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// Create global methods.
myModuleBuilder->CreateGlobalFunctions();
// Arguments for calling the method.
array<Object^>^ arguments =
{ (Object^)(int) 0, "Hello World", "Title", MB_RETRYCANCEL };
MethodInfo^ pinvokeMethod = myModuleBuilder->GetMethod("MessageBoxA");
Console::WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...");
Console::WriteLine("Message box returned: {0}",
pinvokeMethod->Invoke(nullptr, arguments));
};
/* This code example produces input similar to the following:
Testing module-level PInvoke method created with DefinePInvokeMethod...
Message box returned: 4
*/
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace PInvoke
{
public class Example
{
const int MB_RETRYCANCEL = 5;
static void Main()
{
AssemblyName myAssemblyName = new AssemblyName("TempAssembly");
// Define a dynamic assembly in the current application domain.
AssemblyBuilder myAssemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
myAssemblyName, AssemblyBuilderAccess.Run);
// Define a dynamic module in "TempAssembly" assembly.
ModuleBuilder myModuleBuilder =
myAssemblyBuilder.DefineDynamicModule("TempModule");
Type[] paramTypes = { typeof(int), typeof(string), typeof(string), typeof(int) };
// Define a PInvoke method.
MethodBuilder piMethodBuilder = myModuleBuilder.DefinePInvokeMethod(
"MessageBoxA",
"user32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
paramTypes,
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.
piMethodBuilder.SetImplementationFlags(
piMethodBuilder.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// Create global methods.
myModuleBuilder.CreateGlobalFunctions();
// Arguments for calling the method.
Object[] arguments = { 0, "Hello World", "Title", MB_RETRYCANCEL };
MethodInfo pinvokeMethod = myModuleBuilder.GetMethod("MessageBoxA");
Console.WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...");
Console.WriteLine("Message box returned: {0}",
pinvokeMethod.Invoke(null, arguments));
}
}
}
/* This code example produces input similar to the following:
Testing module-level PInvoke method created with DefinePInvokeMethod...
Message box returned: 4
*/
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Namespace PInvoke
Public Class Example
Const MB_RETRYCANCEL As Integer = 5
Shared Sub Main()
Dim myAssemblyName As New AssemblyName("TempAssembly")
' Define a dynamic assembly in the current application domain.
Dim myAssemblyBuilder As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly( _
myAssemblyName, AssemblyBuilderAccess.Run)
' Define a dynamic module in "TempAssembly" assembly.
Dim myModuleBuilder As ModuleBuilder = _
myAssemblyBuilder.DefineDynamicModule("TempModule")
Dim paramTypes() As Type = _
{ GetType(Integer), GetType(string), GetType(string), GetType(Integer) }
' Define a PInvoke method.
Dim piMethodBuilder As MethodBuilder = myModuleBuilder.DefinePInvokeMethod( _
"MessageBoxA", _
"user32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
paramTypes, _
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.
piMethodBuilder.SetImplementationFlags( _
piMethodBuilder.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' Create global methods.
myModuleBuilder.CreateGlobalFunctions()
' Arguments for calling the method.
Dim arguments() As Object= { 0, "Hello World", "Title", MB_RETRYCANCEL }
Dim pinvokeMethod As MethodInfo = _
myModuleBuilder.GetMethod("MessageBoxA")
Console.WriteLine("Testing module-level PInvoke method created with DefinePInvokeMethod...")
Console.WriteLine("Message box returned: {0}", _
pinvokeMethod.Invoke(Nothing, arguments))
End Sub
End Class
End Namespace
' This code example produces input similar to the following:
'
'Testing module-level PInvoke method created with DefinePInvokeMethod...
'Message box returned: 4
Hinweise
Einige DLL-Importattribute (siehe Beschreibung von DllImportAttribute) können nicht als Argumente für diese Methode angegeben werden. Solche Attribute sollten durch Ausgeben eines benutzerdefinierten Attributs für die -Methode festgelegt werden. Beispielsweise wird das DLL-Import-Attribut PreserveSig
festgelegt, indem ein benutzerdefiniertes Attribut ausgibt.
Hinweis
Ab dem .NET Framework 2.0 Service Pack 1 benötigt ReflectionPermission dieses Mitglied nicht mehr das ReflectionPermissionFlag.ReflectionEmit Flag. (Siehe Sicherheitsprobleme in Reflection Emit.) Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher abzielen.