ModuleBuilder.DefinePInvokeMethod Méthode

Définition

Définit une méthode PInvoke.

Surcharges

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

Définit une méthode PInvoke à l'aide du nom, du nom de la DLL dans laquelle la méthode a été définie, des attributs de la méthode, de la convention d'appel, du type de retour, des types de paramètres et des indicateurs PInvoke spécifiés.

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

Définit une méthode PInvoke à l'aide du nom, du nom de la DLL dans laquelle la méthode a été définie, des attributs de la méthode, de la convention d'appel, du type de retour, des types de paramètres et des indicateurs PInvoke spécifiés.

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

Source:
ModuleBuilder.cs
Source:
ModuleBuilder.cs
Source:
ModuleBuilder.cs

Définit une méthode PInvoke à l'aide du nom, du nom de la DLL dans laquelle la méthode a été définie, des attributs de la méthode, de la convention d'appel, du type de retour, des types de paramètres et des indicateurs PInvoke spécifiés.

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

Paramètres

name
String

Nom de la méthode PInvoke. name ne peut pas contenir des valeurs Null imbriquées.

dllName
String

Nom de la DLL dans laquelle la méthode PInvoke est définie.

attributes
MethodAttributes

Attributs de la méthode.

callingConvention
CallingConventions

Convention d’appel de la méthode.

returnType
Type

Type de retour de la méthode.

parameterTypes
Type[]

Types des paramètres de la méthode.

nativeCallConv
CallingConvention

Convention d’appel native.

nativeCharSet
CharSet

Jeu de caractères natif de la méthode.

Retours

Méthode PInvoke définie.

Exceptions

La méthode n'est pas statique ou le type conteneur est une interface.

- ou -

La méthode est de type abstract.

- ou -

La méthode a déjà été définie.

name ou dllName est null.

Le type conteneur a été créé au préalable à l'aide de la méthode CreateType().

Exemples

L’exemple suivant illustre l’utilisation de la DefinePInvokeMethod méthode pour créer un MethodBuilder pour une méthode externe non managée, MessageBoxA, dans l’API Windows. L’exemple montre comment afficher une zone de message avec les boutons Réessayer et Annuler , et afficher la valeur de retour de la zone de message.

Important

Pour obtenir une valeur de retour autre que zéro, vous devez ajouter MethodImplAttributes.PreserveSig aux indicateurs d’implémentation de méthode après avoir créé le , à l’aide MethodBuilderdes MethodBuilder.GetMethodImplementationFlags méthodes et MethodBuilder.SetImplementationFlags .

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
 */

Remarques

Certains attributs d’importation dll (voir la description de System.Runtime.InteropServices.DllImportAttribute) ne peuvent pas être spécifiés comme arguments de cette méthode. Ces attributs doivent être définis en émettant un attribut personnalisé pour la méthode. Par exemple, l’attribut PreserveSig d’importation DLL est défini en émettant un attribut personnalisé.

Notes

À compter du .NET Framework 2.0 Service Pack 1, ce membre n’a plus besoin de ReflectionPermission l’indicateur ReflectionPermissionFlag.ReflectionEmit . (Consultez Problèmes de sécurité dans l’émission de réflexion.) Pour utiliser cette fonctionnalité, votre application doit cibler .NET Framework 3.5 ou version ultérieure.

S’applique à

.NET 10 et autres versions
Produit Versions
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.1

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

Source:
ModuleBuilder.cs
Source:
ModuleBuilder.cs
Source:
ModuleBuilder.cs

Définit une méthode PInvoke à l'aide du nom, du nom de la DLL dans laquelle la méthode a été définie, des attributs de la méthode, de la convention d'appel, du type de retour, des types de paramètres et des indicateurs PInvoke spécifiés.

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

Paramètres

name
String

Nom de la méthode PInvoke. name ne peut pas contenir des valeurs Null imbriquées.

dllName
String

Nom de la DLL dans laquelle la méthode PInvoke est définie.

entryName
String

Nom du point d’entrée dans la DLL.

attributes
MethodAttributes

Attributs de la méthode.

callingConvention
CallingConventions

Convention d’appel de la méthode.

returnType
Type

Type de retour de la méthode.

parameterTypes
Type[]

Types des paramètres de la méthode.

nativeCallConv
CallingConvention

Convention d’appel native.

nativeCharSet
CharSet

Jeu de caractères natif de la méthode.

Retours

Méthode PInvoke définie.

Exceptions

La méthode n'est pas statique, le type conteneur est une interface, la méthode est abstraite ou elle a été définie au préalable.

name ou dllName est null.

Le type conteneur a été créé au préalable à l'aide de la méthode CreateType().

Exemples

L’exemple suivant illustre l’utilisation de la DefinePInvokeMethod méthode pour créer un MethodBuilder pour une méthode externe non managée, MessageBoxA, dans l’API Windows. L’exemple montre comment afficher une zone de message avec les boutons Réessayer et Annuler , et afficher la valeur de retour de la zone de message.

Important

Pour obtenir une valeur de retour autre que zéro, vous devez ajouter MethodImplAttributes.PreserveSig aux indicateurs d’implémentation de méthode après avoir créé le , à l’aide MethodBuilderdes MethodBuilder.GetMethodImplementationFlags méthodes et MethodBuilder.SetImplementationFlags .

Cet exemple utilise une surcharge différente de la DefinePInvokeMethod méthode, mais la technique est la même.

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
 */

Remarques

Certains attributs d’importation dll (voir la description de DllImportAttribute) ne peuvent pas être spécifiés comme arguments pour cette méthode. Ces attributs doivent être définis en émettant un attribut personnalisé pour la méthode. Par exemple, l’attribut PreserveSig d’importation DLL est défini en émettant un attribut personnalisé.

Notes

À compter du .NET Framework 2.0 Service Pack 1, ce membre n’a plus besoin de ReflectionPermission l’indicateur ReflectionPermissionFlag.ReflectionEmit . (Consultez Problèmes de sécurité dans l’émission de réflexion.) Pour utiliser cette fonctionnalité, votre application doit cibler .NET Framework 3.5 ou version ultérieure.

S’applique à

.NET 10 et autres versions
Produit Versions
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.1