ModuleBuilder.DefinePInvokeMethod Metoda
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Definiuje metodę PInvoke
.
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definiuje metodę |
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definiuje metodę |
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(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
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 , MessageBoxA
w 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 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
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(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
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 , MessageBoxA
w 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 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
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 |
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię: