ModuleBuilder.DefinePInvokeMethod Methode

Definitie

Definieert een PInvoke methode.

Overloads

Name Description
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)

Definieert een PInvoke methode met de opgegeven naam, de naam van het DLL-bestand waarin de methode is gedefinieerd, de kenmerken van de methode, de aanroepconventie van de methode, het retourtype van de methode, de typen van de parameters van de methode en de PInvoke vlaggen.

DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)

Definieert een PInvoke methode met de opgegeven naam, de naam van het DLL-bestand waarin de methode is gedefinieerd, de kenmerken van de methode, de aanroepconventie van de methode, het retourtype van de methode, de typen van de parameters van de methode en de PInvoke vlaggen.

DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)

Definieert een PInvoke methode met de opgegeven naam, de naam van het DLL-bestand waarin de methode is gedefinieerd, de kenmerken van de methode, de aanroepconventie van de methode, het retourtype van de methode, de typen van de parameters van de methode en de PInvoke vlaggen.

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);
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

Parameters

name
String

De naam van de PInvoke methode. name kan geen ingesloten null-waarden bevatten.

dllName
String

De naam van het DLL-bestand waarin de PInvoke methode is gedefinieerd.

attributes
MethodAttributes

De kenmerken van de methode.

callingConvention
CallingConventions

De aanroepconventie van de methode.

returnType
Type

Het retourtype van de methode.

parameterTypes
Type[]

De typen parameters van de methode.

nativeCallConv
CallingConvention

De systeemeigen oproepconventie.

nativeCharSet
CharSet

De systeemeigen tekenset van de methode.

Retouren

De gedefinieerde PInvoke methode.

Uitzonderingen

De methode is niet statisch of als het type bevat een interface is.

– of –

De methode is abstract.

– of –

De methode is eerder gedefinieerd.

name of dllName is null.

Het bevattende type is eerder gemaakt met behulp van CreateType()

Voorbeelden

In het volgende voorbeeld ziet u het gebruik van de methode DefinePInvokeMethod voor het maken van een MethodBuilder voor een externe onbeheerde methode, MessageBoxA, in de Windows-API. In het voorbeeld wordt een berichtvak weergegeven met de knoppen Opnieuw proberen en Annuleren en wordt de retourwaarde uit het berichtvak weergegeven.

Important

Als u een niet-nul retourwaarde wilt ophalen, moet u toevoegen MethodImplAttributes.PreserveSig aan de implementatievlagmen van de methode nadat u de MethodBuilder, met behulp van de MethodBuilder.GetMethodImplementationFlags en MethodBuilder.SetImplementationFlags methoden hebt gemaakt.

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

Opmerkingen

Sommige DLL-importkenmerken (zie de beschrijving van System.Runtime.InteropServices.DllImportAttribute) kunnen niet worden opgegeven als argumenten voor deze methode. Dergelijke kenmerken moeten worden ingesteld door een aangepast kenmerk voor de methode te verzenden. Het DLL-importkenmerk PreserveSig wordt bijvoorbeeld ingesteld door een aangepast kenmerk te verzenden.

Van toepassing op

DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)

Definieert een PInvoke methode met de opgegeven naam, de naam van het DLL-bestand waarin de methode is gedefinieerd, de kenmerken van de methode, de aanroepconventie van de methode, het retourtype van de methode, de typen van de parameters van de methode en de PInvoke vlaggen.

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);
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

Parameters

name
String

De naam van de PInvoke methode. name kan geen ingesloten null-waarden bevatten.

dllName
String

De naam van het DLL-bestand waarin de PInvoke methode is gedefinieerd.

entryName
String

De naam van het toegangspunt in het DLL-bestand.

attributes
MethodAttributes

De kenmerken van de methode.

callingConvention
CallingConventions

De aanroepconventie van de methode.

returnType
Type

Het retourtype van de methode.

parameterTypes
Type[]

De typen parameters van de methode.

nativeCallConv
CallingConvention

De systeemeigen oproepconventie.

nativeCharSet
CharSet

De systeemeigen tekenset van de methode.

Retouren

De gedefinieerde PInvoke methode.

Uitzonderingen

De methode is niet statisch of als het type bevat een interface is of als de methode abstract is als de methode eerder is gedefinieerd.

name of dllName is null.

Het bevattende type is eerder gemaakt met behulp van CreateType()

Voorbeelden

In het volgende voorbeeld ziet u het gebruik van de methode DefinePInvokeMethod voor het maken van een MethodBuilder voor een externe onbeheerde methode, MessageBoxA, in de Windows-API. In het voorbeeld wordt een berichtvak weergegeven met de knoppen Opnieuw proberen en Annuleren en wordt de retourwaarde uit het berichtvak weergegeven.

Important

Als u een niet-nul retourwaarde wilt ophalen, moet u toevoegen MethodImplAttributes.PreserveSig aan de implementatievlagmen van de methode nadat u de MethodBuilder, met behulp van de MethodBuilder.GetMethodImplementationFlags en MethodBuilder.SetImplementationFlags methoden hebt gemaakt.

In dit voorbeeld wordt een andere overbelasting van de DefinePInvokeMethod methode gebruikt, maar de techniek is hetzelfde.

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

Opmerkingen

Sommige DLL-importkenmerken (zie de beschrijving van DllImportAttribute) kunnen niet worden opgegeven als argumenten voor deze methode. Dergelijke kenmerken moeten worden ingesteld door een aangepast kenmerk voor de methode te verzenden. Het DLL-importkenmerk PreserveSig wordt bijvoorbeeld ingesteld door een aangepast kenmerk te verzenden.

Van toepassing op