ModuleBuilder.DefinePInvokeMethod Metoda

Definicja

Definiuje metodę PInvoke .

Przeciążenia

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

Definiuje metodę PInvoke o określonej nazwie, nazwę biblioteki DLL, w której zdefiniowano metodę, atrybuty metody, konwencję wywoływania metody, typ zwracany metody, typy parametrów metody i PInvoke flagi.

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

Definiuje metodę PInvoke o określonej nazwie, nazwę biblioteki DLL, w której zdefiniowano metodę, atrybuty metody, konwencję wywoływania metody, typ zwracany metody, typy parametrów metody i PInvoke flagi.

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

Źródło:
ModuleBuilder.cs
Źródło:
ModuleBuilder.cs
Źródło:
ModuleBuilder.cs

Definiuje metodę PInvoke o określonej nazwie, nazwę biblioteki DLL, w której zdefiniowano metodę, atrybuty metody, konwencję wywoływania metody, typ zwracany metody, typy parametrów metody i PInvoke flagi.

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

Parametry

name
String

Nazwa PInvoke metody. name nie może zawierać osadzonych wartości null.

dllName
String

Nazwa biblioteki DLL, w której zdefiniowano metodę PInvoke .

attributes
MethodAttributes

Atrybuty metody .

callingConvention
CallingConventions

Konwencja wywoływania metody.

returnType
Type

Zwracany typ metody.

parameterTypes
Type[]

Typy parametrów metody.

nativeCallConv
CallingConvention

Natywna konwencja wywoływania.

nativeCharSet
CharSet

Natywny zestaw znaków metody.

Zwraca

Zdefiniowana PInvoke metoda.

Wyjątki

Metoda nie jest statyczna lub jeśli typ zawierający jest interfejsem.

-lub-

Metoda jest abstrakcyjna.

-lub-

Metoda została wcześniej zdefiniowana.

name lub dllName to null.

Typ zawierający został wcześniej utworzony przy użyciu polecenia CreateType()

Przykłady

Poniższy przykład ilustruje użycie DefinePInvokeMethod metody do utworzenia MethodBuilder metody dla zewnętrznej metody niezarządzanej , MessageBoxAw interfejsie API systemu Windows. W przykładzie zostanie wyświetlone pole komunikatu z przyciskami Ponów próbę i Anuluj , a następnie zostanie wyświetlona wartość zwracana z pola komunikatu.

Ważne

Aby uzyskać wartość zwracaną niezerową, należy dodać MethodImplAttributes.PreserveSig do flag implementacji metody po utworzeniu MethodBuilderelementu , przy użyciu MethodBuilder.GetMethodImplementationFlags metod i 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
 */

Uwagi

Niektóre atrybuty importu bibliotek DLL (zobacz opis elementu System.Runtime.InteropServices.DllImportAttribute) nie można określić jako argumentów tej metody. Takie atrybuty należy ustawić przez emitowanie atrybutu niestandardowego dla metody . Na przykład atrybut PreserveSig importu biblioteki DLL jest ustawiany przez emitowanie atrybutu niestandardowego.

Uwaga

Począwszy od .NET Framework dodatku Service Pack 2.0, ten element członkowski nie wymaga ReflectionPermission już flagiReflectionPermissionFlag.ReflectionEmit. (Zobacz Problemy z zabezpieczeniami w emitu odbicia). Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.

Dotyczy

.NET 9 i inne wersje
Produkt Wersje
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.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)

Źródło:
ModuleBuilder.cs
Źródło:
ModuleBuilder.cs
Źródło:
ModuleBuilder.cs

Definiuje metodę PInvoke o określonej nazwie, nazwę biblioteki DLL, w której zdefiniowano metodę, atrybuty metody, konwencję wywoływania metody, typ zwracany metody, typy parametrów metody i PInvoke flagi.

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

Parametry

name
String

Nazwa PInvoke metody. name nie może zawierać osadzonych wartości null.

dllName
String

Nazwa biblioteki DLL, w której zdefiniowano metodę PInvoke .

entryName
String

Nazwa punktu wejścia w dll.

attributes
MethodAttributes

Atrybuty metody .

callingConvention
CallingConventions

Konwencja wywoływania metody.

returnType
Type

Zwracany typ metody.

parameterTypes
Type[]

Typy parametrów metody.

nativeCallConv
CallingConvention

Natywna konwencja wywoływania.

nativeCharSet
CharSet

Natywny zestaw znaków metody.

Zwraca

Zdefiniowana PInvoke metoda.

Wyjątki

Metoda nie jest statyczna lub jeśli typ zawierający jest interfejsem lub jeśli metoda jest abstrakcyjna, jeśli metoda została wcześniej zdefiniowana.

name lub dllName to null.

Typ zawierający został wcześniej utworzony przy użyciu polecenia CreateType()

Przykłady

Poniższy przykład ilustruje użycie DefinePInvokeMethod metody do utworzenia MethodBuilder metody dla zewnętrznej metody niezarządzanej , MessageBoxAw interfejsie API systemu Windows. W przykładzie zostanie wyświetlone pole komunikatu z przyciskami Ponów próbę i Anuluj , a następnie zostanie wyświetlona wartość zwracana z pola komunikatu.

Ważne

Aby uzyskać wartość zwracaną niezerową, należy dodać MethodImplAttributes.PreserveSig do flag implementacji metody po utworzeniu MethodBuilderelementu , przy użyciu MethodBuilder.GetMethodImplementationFlags metod i MethodBuilder.SetImplementationFlags .

W tym przykładzie użyto innego przeciążenia DefinePInvokeMethod metody, ale technika jest taka sama.

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

Uwagi

Niektóre atrybuty importu bibliotek DLL (zobacz opis DllImportAttribute) nie można określić jako argumentów dla tej metody. Takie atrybuty należy ustawić przez emitowanie atrybutu niestandardowego dla metody . Na przykład atrybut PreserveSig importu biblioteki DLL jest ustawiany przez emitowanie atrybutu niestandardowego.

Uwaga

Począwszy od .NET Framework dodatku Service Pack 2.0, ten element członkowski nie wymaga ReflectionPermission już flagiReflectionPermissionFlag.ReflectionEmit. (Zobacz Problemy z zabezpieczeniami w emitu odbicia). Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.

Dotyczy

.NET 9 i inne wersje
Produkt Wersje
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.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