TypeBuilder.DefinePInvokeMethod Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Definuje metodu PInvoke
.
Přetížení
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definuje metodu |
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet) |
Definuje metodu |
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][], CallingConvention, CharSet) |
Definuje metodu |
DefinePInvokeMethod(String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
Definuje metodu PInvoke
vzhledem k jejímu názvu, název knihovny DLL, ve které je definována metoda, atributy metody, konvence volání metody, návratový typ metody, typy parametrů metody a PInvoke
příznaky.
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
Název PInvoke
metody.
name
nesmí obsahovat vložené hodnoty null.
- dllName
- String
Název knihovny DLL, ve které je definována PInvoke
metoda.
- attributes
- MethodAttributes
Atributy metody.
- callingConvention
- CallingConventions
Konvence volání metody
- returnType
- Type
Návratový typ metody.
- parameterTypes
- Type[]
Typy parametrů metody.
- nativeCallConv
- CallingConvention
Nativní konvence volání
- nativeCharSet
- CharSet
Nativní znaková sada metody.
Návraty
Definovaná PInvoke
metoda.
Výjimky
Metoda není statická.
-nebo-
Nadřazený typ je rozhraní.
-nebo-
Metoda je abstraktní.
-nebo-
Metoda byla dříve definována.
-nebo-
Délka name
nebo dllName
je nula.
name
nebo dllName
je null
.
Obsahující typ byl dříve vytvořen pomocí příkazu CreateType().
Příklady
Následující příklad ukazuje, jak použít metodu DefinePInvokeMethod k vytvoření PInvoke
metody a jak přidat MethodImplAttributes.PreserveSig příznak do příznaků implementace metody po vytvoření MethodBuildermetody , pomocí MethodBuilder.GetMethodImplementationFlags metod a MethodBuilder.SetImplementationFlags .
Důležité
Pokud chcete získat nenulovou návratovou hodnotu, musíte přidat MethodImplAttributes.PreserveSig příznak.
Příklad vytvoří dynamické sestavení s jedním dynamickým modulem a jedním typem MyType
, který obsahuje metodu PInvoke
. Metoda PInvoke
představuje funkci Win32 GetTickCount
.
Při spuštění příkladu spustí metodu PInvoke
. Také uloží dynamické sestavení jako PInvokeTest.dll. Můžete použít Ildasm.exe (IL Disassembler) k prozkoumání MyType
třídy a static
metody (Shared
v jazyce Visual Basic), PInvoke
která obsahuje. Program jazyka Visual Basic nebo C#, který používá statickou MyType.GetTickCount
metodu, můžete zkompilovat zahrnutím odkazu na knihovnu DLL při spuštění csc.exe nebo vbc.exe, /r:PInvokeTest.dll
například .
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
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.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
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.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
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.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
Poznámky
Některé atributy importu knihovny DLL (viz popis ) DllImportAttributenelze zadat jako argumenty pro tuto metodu. Například atribut MethodImplAttributes.PreserveSig importu knihovny DLL musí být přidán po PInvoke
vytvoření metody, pokud metoda vrátí hodnotu. Příklad ukazuje, jak to udělat.
Platí pro
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], CallingConvention, CharSet)
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
Definuje metodu PInvoke
vzhledem k jejímu názvu, název knihovny DLL, ve které je definována metoda, název vstupního bodu, atributy metody, konvence volání metody, návratový typ metody, typy parametrů metody a PInvoke
příznaky.
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
Název PInvoke
metody.
name
nesmí obsahovat vložené hodnoty null.
- dllName
- String
Název knihovny DLL, ve které je definována PInvoke
metoda.
- entryName
- String
Název vstupního bodu v knihovně DLL.
- attributes
- MethodAttributes
Atributy metody.
- callingConvention
- CallingConventions
Konvence volání metody
- returnType
- Type
Návratový typ metody.
- parameterTypes
- Type[]
Typy parametrů metody.
- nativeCallConv
- CallingConvention
Nativní konvence volání
- nativeCharSet
- CharSet
Nativní znaková sada metody.
Návraty
Definovaná PInvoke
metoda.
Výjimky
Metoda není statická.
-nebo-
Nadřazený typ je rozhraní.
-nebo-
Metoda je abstraktní.
-nebo-
Metoda byla dříve definována.
-nebo-
Délka name
, dllName
nebo entryName
je nula.
name
, dllName
nebo entryName
je null
.
Obsahující typ byl dříve vytvořen pomocí příkazu CreateType().
Příklady
Následující příklad kódu ukazuje, jak použít metodu DefinePInvokeMethod k vytvoření PInvoke
metody a jak přidat MethodImplAttributes.PreserveSig příznak do příznaků implementace metody po vytvoření MethodBuilder, pomocí MethodBuilder.GetMethodImplementationFlags metod a MethodBuilder.SetImplementationFlags .
Důležité
Pokud chcete získat nenulovou návratovou hodnotu, musíte přidat MethodImplAttributes.PreserveSig příznak.
Příklad vytvoří dynamické sestavení s jedním dynamickým modulem a jedním typem MyType
, který obsahuje metodu PInvoke
. Metoda PInvoke
představuje funkci Win32 GetTickCount
.
Při spuštění příkladu spustí metodu PInvoke
. Také uloží dynamické sestavení jako PInvokeTest.dll. Můžete použít Ildasm.exe (IL Disassembler) k prozkoumání MyType
třídy a static
metody (Shared
v jazyce Visual Basic), PInvoke
která obsahuje. Program jazyka Visual Basic nebo C#, který používá statickou MyType.GetTickCount
metodu, můžete zkompilovat zahrnutím odkazu na knihovnu DLL při spuštění csc.exe nebo vbc.exe, /r:PInvokeTest.dll
například .
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
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.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
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.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
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.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
Poznámky
Některé atributy importu knihovny DLL (viz popis ) DllImportAttributenelze zadat jako argumenty pro tuto metodu. Například atribut MethodImplAttributes.PreserveSig importu knihovny DLL musí být přidán po PInvoke
vytvoření metody, pokud metoda vrátí hodnotu. Příklad ukazuje, jak to udělat.
Platí pro
DefinePInvokeMethod(String, String, String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][], CallingConvention, CharSet)
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
- Zdroj:
- TypeBuilder.cs
Definuje metodu PInvoke
s názvem, názvem knihovny DLL, ve které je metoda definována, názvem vstupního bodu, atributy metody, konvencí volání metody, návratovým typem metody, typy parametrů metody, PInvoke
příznaky a vlastní modifikátory pro parametry a návratový typ.
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 ^> ^ returnTypeRequiredCustomModifiers, cli::array <Type ^> ^ returnTypeOptionalCustomModifiers, cli::array <Type ^> ^ parameterTypes, cli::array <cli::array <Type ^> ^> ^ parameterTypeRequiredCustomModifiers, cli::array <cli::array <Type ^> ^> ^ parameterTypeOptionalCustomModifiers, 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[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers, Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers, 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[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers, System.Runtime.InteropServices.CallingConvention nativeCallConv, System.Runtime.InteropServices.CharSet nativeCharSet);
member this.DefinePInvokeMethod : string * string * string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type[] * Type[] * 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, returnTypeRequiredCustomModifiers As Type(), returnTypeOptionalCustomModifiers As Type(), parameterTypes As Type(), parameterTypeRequiredCustomModifiers As Type()(), parameterTypeOptionalCustomModifiers As Type()(), nativeCallConv As CallingConvention, nativeCharSet As CharSet) As MethodBuilder
Parametry
- name
- String
Název PInvoke
metody.
name
nesmí obsahovat vložené hodnoty null.
- dllName
- String
Název knihovny DLL, ve které je definována PInvoke
metoda.
- entryName
- String
Název vstupního bodu v knihovně DLL.
- attributes
- MethodAttributes
Atributy metody.
- callingConvention
- CallingConventions
Konvence volání metody
- returnType
- Type
Návratový typ metody.
- returnTypeRequiredCustomModifiers
- Type[]
Pole typů představující požadované vlastní modifikátory, například IsConst, pro návratový typ metody. Pokud návratový typ nemá žádné požadované vlastní modifikátory, zadejte null
.
- returnTypeOptionalCustomModifiers
- Type[]
Pole typů představující volitelné vlastní modifikátory, například IsConst, pro návratový typ metody. Pokud návratový typ nemá žádné volitelné vlastní modifikátory, zadejte null
.
- parameterTypes
- Type[]
Typy parametrů metody.
- parameterTypeRequiredCustomModifiers
- Type[][]
Pole polí typů. Každé pole typů představuje požadované vlastní modifikátory pro odpovídající parametr, například IsConst. Pokud určitý parametr nemá žádné požadované vlastní modifikátory, zadejte null
místo pole typů. Pokud žádný z parametrů nevyžaduje vlastní modifikátory, zadejte null
místo pole pole.
- parameterTypeOptionalCustomModifiers
- Type[][]
Pole polí typů. Každé pole typů představuje volitelné vlastní modifikátory odpovídajícího parametru, například IsConst. Pokud určitý parametr nemá žádné volitelné vlastní modifikátory, zadejte null
místo pole typů. Pokud žádný z parametrů nemá volitelné vlastní modifikátory, zadejte null
místo pole pole.
- nativeCallConv
- CallingConvention
Nativní konvence volání
- nativeCharSet
- CharSet
Nativní znaková sada metody.
Návraty
A MethodBuilder představující definovanou PInvoke
metodu.
Výjimky
Metoda není statická.
-nebo-
Nadřazený typ je rozhraní.
-nebo-
Metoda je abstraktní.
-nebo-
Metoda byla dříve definována.
-nebo-
Délka name
, dllName
nebo entryName
je nula.
-nebo-
Velikost nebo parameterTypeRequiredCustomModifiers
parameterTypeOptionalCustomModifiers
se nerovná velikosti parameterTypes
.
name
, dllName
nebo entryName
je null
.
Typ byl dříve vytvořen pomocí příkazu CreateType().
-nebo-
Pro aktuální dynamický typ je vlastnost IsGenericType , ale IsGenericTypeDefinition vlastnost je false
.true
Příklady
Následující příklad kódu ukazuje, jak použít metodu DefinePInvokeMethod k vytvoření PInvoke
metody a jak přidat MethodImplAttributes.PreserveSig příznak do příznaků implementace metody po vytvoření MethodBuilder, pomocí MethodBuilder.GetMethodImplementationFlags metod a MethodBuilder.SetImplementationFlags .
Příklad vytvoří dynamické sestavení s jedním dynamickým modulem a jedním typem MyType
, který obsahuje metodu PInvoke
. Metoda PInvoke
představuje funkci Win32 GetTickCount
.
Důležité
Pokud chcete získat nenulovou návratovou hodnotu, musíte přidat MethodImplAttributes.PreserveSig příznak.
Poznámka
Příklad používá přetížení, které nezadává vlastní modifikátory. Pokud chcete zadat vlastní modifikátory, změňte ukázkový kód tak, aby místo toho používal přetížení této metody.
Při spuštění příkladu spustí metodu PInvoke
. Také uloží dynamické sestavení jako PInvokeTest.dll. Můžete použít Ildasm.exe (IL Disassembler) k prozkoumání MyType
třídy a static
metody (Shared
v jazyce Visual Basic), PInvoke
která obsahuje. Program jazyka Visual Basic nebo C#, který používá statickou MyType.GetTickCount
metodu, můžete zkompilovat zahrnutím odkazu na knihovnu DLL při spuštění csc.exe nebo vbc.exe, /r:PInvokeTest.dll
například .
using namespace System;
using namespace System::Text;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::InteropServices;
void main()
{
// Create the AssemblyBuilder.
AssemblyName^ asmName = gcnew AssemblyName("PInvokeTest");
AssemblyBuilder^ dynamicAsm = AppDomain::CurrentDomain->DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess::RunAndSave
);
// Create the module.
ModuleBuilder^ dynamicMod =
dynamicAsm->DefineDynamicModule(asmName->Name, asmName->Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder^ tb = dynamicMod->DefineType(
"MyType",
TypeAttributes::Public | TypeAttributes::UnicodeClass
);
MethodBuilder^ mb = tb->DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes::Public | MethodAttributes::Static | MethodAttributes::PinvokeImpl,
CallingConventions::Standard,
int::typeid,
Type::EmptyTypes,
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.
mb->SetImplementationFlags(
mb->GetMethodImplementationFlags() | MethodImplAttributes::PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type^ t = tb->CreateType();
MethodInfo^ mi = t->GetMethod("GetTickCount");
Console::WriteLine("Testing PInvoke method...");
Console::WriteLine("GetTickCount returned: {0}", mi->Invoke(nullptr, nullptr));
// Produce the .dll file.
Console::WriteLine("Saving: " + asmName->Name + ".dll");
dynamicAsm->Save(asmName->Name + ".dll");
};
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1314410994
Saving: PInvokeTest.dll
*/
using System;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
public class Example
{
public static void Main()
{
// Create the AssemblyBuilder.
AssemblyName asmName = new AssemblyName("PInvokeTest");
AssemblyBuilder dynamicAsm = AppDomain.CurrentDomain.DefineDynamicAssembly(
asmName,
AssemblyBuilderAccess.RunAndSave
);
// Create the module.
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
// Create the TypeBuilder for the class that will contain the
// signature for the PInvoke call.
TypeBuilder tb = dynamicMod.DefineType(
"MyType",
TypeAttributes.Public | TypeAttributes.UnicodeClass
);
MethodBuilder mb = tb.DefinePInvokeMethod(
"GetTickCount",
"Kernel32.dll",
MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl,
CallingConventions.Standard,
typeof(int),
Type.EmptyTypes,
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.
mb.SetImplementationFlags(
mb.GetMethodImplementationFlags() | MethodImplAttributes.PreserveSig);
// The PInvoke method does not have a method body.
// Create the class and test the method.
Type t = tb.CreateType();
MethodInfo mi = t.GetMethod("GetTickCount");
Console.WriteLine("Testing PInvoke method...");
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(null, null));
// Produce the .dll file.
Console.WriteLine("Saving: " + asmName.Name + ".dll");
dynamicAsm.Save(asmName.Name + ".dll");
}
}
/* This example produces output similar to the following:
Testing PInvoke method...
GetTickCount returned: 1312576235
Saving: PInvokeTest.dll
*/
Imports System.Text
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' Create the AssemblyBuilder.
Dim asmName As New AssemblyName("PInvokeTest")
Dim dynamicAsm As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, _
AssemblyBuilderAccess.RunAndSave)
' Create the module.
Dim dynamicMod As ModuleBuilder = _
dynamicAsm.DefineDynamicModule(asmName.Name, asmName.Name & ".dll")
' Create the TypeBuilder for the class that will contain the
' signature for the PInvoke call.
Dim tb As TypeBuilder = dynamicMod.DefineType("MyType", _
TypeAttributes.Public Or TypeAttributes.UnicodeClass)
Dim mb As MethodBuilder = tb.DefinePInvokeMethod( _
"GetTickCount", _
"Kernel32.dll", _
MethodAttributes.Public Or MethodAttributes.Static Or MethodAttributes.PinvokeImpl, _
CallingConventions.Standard, _
GetType(Integer), _
Type.EmptyTypes, _
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.
mb.SetImplementationFlags( _
mb.GetMethodImplementationFlags() Or MethodImplAttributes.PreserveSig)
' The PInvoke method does not have a method body.
' Create the class and test the method.
Dim t As Type = tb.CreateType()
Dim mi As MethodInfo = t.GetMethod("GetTickCount")
Console.WriteLine("Testing PInvoke method...")
Console.WriteLine("GetTickCount returned: {0}", mi.Invoke(Nothing, Nothing))
' Produce the .dll file.
Console.WriteLine("Saving: " & asmName.Name & ".dll")
dynamicAsm.Save(asmName.Name & ".dll")
End Sub
End Class
' This example produces output similar to the following:
'
'Testing PInvoke method...
'GetTickCount returned: 1313078714
'Saving: PInvokeTest.dll
Poznámky
Některé atributy importu knihovny DLL (viz popis ) DllImportAttributenelze zadat jako argumenty pro tuto metodu. Například atribut MethodImplAttributes.PreserveSig importu knihovny DLL musí být přidán po PInvoke
vytvoření metody, pokud metoda vrátí hodnotu. Příklad ukazuje, jak to udělat.
Poznámka
Další informace o vlastních modifikátorech najdete v tématech ECMA C# a Common Language Infrastructure Standards a Standard ECMA-335 – Common Language Infrastructure (CLI) .