DynamicMethod.Invoke 方法

定义

在指定的活页夹的约束下,用指定的区域性信息,使用指定的参数调用动态方法。

public:
 override System::Object ^ Invoke(System::Object ^ obj, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ parameters, System::Globalization::CultureInfo ^ culture);
public override object? Invoke (object? obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object?[]? parameters, System.Globalization.CultureInfo? culture);
public override object Invoke (object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture);
override this.Invoke : obj * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo -> obj
Public Overrides Function Invoke (obj As Object, invokeAttr As BindingFlags, binder As Binder, parameters As Object(), culture As CultureInfo) As Object

参数

obj
Object

对动态方法忽略此参数,因为它们是静态的。 指定 null

invokeAttr
BindingFlags

BindingFlags 值的按位组合。

binder
Binder

一个 Binder 对象,用于启用绑定、对参数类型的强制、对成员的调用,以及通过反射对 MemberInfo 对象的检索。 如果 bindernull,则使用默认联编程序。 如需了解详情,请访问 Binder

parameters
Object[]

自变量列表。 此自变量数组在数量、顺序和类型方面与要调用的方法的参数相同。 如果不存在任何参数,则此参数应为 null

culture
CultureInfo

用于控制类型强制的 CultureInfo 的实例。 如果这是 null,则使用当前线程的 CultureInfo。 例如,需要此信息将表示 1000 的 String 正确转换为 Double 值,因为不同的区域性以不同的方式表示 1000。

返回

一个 Object,它包含被调用的方法的返回值。

例外

不支持 VarArgs 调用约定。

parameters 中的元素数与动态方法中的参数数目不匹配。

parameters 的一个或多个元素的类型与动态方法的相应参数的类型不匹配。

动态方法与模块关联、未以匿名方式托管,并且在 skipVisibility 设置为 false 的情况下构造,但动态方法访问不是 publicinternal(Visual Basic 中的 Friend)的成员。

- 或 -

动态方法被以匿名方式托管,并在 skipVisibility 设置为 false 的情况下构造,但是它访问不是 public 的成员。

- 或 -

动态方法包含无法验证的代码。 请参阅“验证”部分中的 DynamicMethod 注释。

示例

下面的代码示例使用 US-English 区域性调用具有确切绑定的动态方法。 此代码示例是为 DynamicMethod 类提供的一个更大示例的一部分。

Console::WriteLine("\r\nUse the Invoke method to execute the dynamic method:");
// Create an array of arguments to use with the Invoke method.
array<Object^>^ invokeArgs = { "\r\nHello, World!", 42 };
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and value-type arguments
// must be boxed.
Object^ objRet = hello->Invoke(nullptr, BindingFlags::ExactBinding, nullptr, invokeArgs, gcnew CultureInfo("en-us"));
Console::WriteLine("hello.Invoke returned: " + objRet);
Console.WriteLine("\r\nUse the Invoke method to execute the dynamic method:");
// Create an array of arguments to use with the Invoke method.
object[] invokeArgs = {"\r\nHello, World!", 42};
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and value-type arguments
// must be boxed.
object objRet = hello.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us"));
Console.WriteLine("hello.Invoke returned: " + objRet);
Console.WriteLine(vbCrLf & "Use the Invoke method to execute the dynamic method:")
' Create an array of arguments to use with the Invoke method.
Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42}
' Invoke the dynamic method using the arguments. This is much
' slower than using the delegate, because you must create an
' array to contain the arguments, and value-type arguments
' must be boxed.
Dim objRet As Object = hello.Invoke(Nothing, _
    BindingFlags.ExactBinding, Nothing, invokeArgs, _
    New CultureInfo("en-us"))
Console.WriteLine("hello.Invoke returned: {0}", objRet)

注解

除了列出的异常之外,调用代码还应准备好捕获动态方法引发的任何异常。

使用 方法创建的 CreateDelegate 委托执行动态方法比使用 Invoke 方法执行动态方法更高效。

Invoke调用 方法或 CreateDelegate 方法完成动态方法。 将忽略任何进一步更改动态方法的尝试,例如修改参数定义或发出更多 Microsoft 中间语言 (MSIL) ;不会引发异常。

所有动态方法都是静态的,因此始终 obj 忽略 参数。 若要将动态方法视为实例方法,请使用 CreateDelegate(Type, Object) 采用对象实例的重载。

如果动态方法没有参数,则 的值 parameters 应为 null。 否则,参数数组中元素的数量、类型和顺序应与动态方法的参数数、类型和顺序相同。

注意

此方法重载由 Invoke(Object, Object[])MethodBase 类继承的方法重载调用,因此前面的注释适用于这两个重载。

此方法不直接要求权限,但调用动态方法可能会导致安全要求,具体取决于 方法。 例如,对于创建且 restrictedSkipVisibility 参数设置为 false的匿名托管动态方法,不会提出任何要求。 另一方面,如果创建一个设置为 true 的方法restrictedSkipVisibility,以便它可以访问目标程序集的隐藏成员,则该方法将导致对目标程序集的权限以及 ReflectionPermissionReflectionPermissionFlag.MemberAccess 标志的需求。

注意

在 .NET Framework 2.0 之前,此方法需要使用 ReflectionPermissionMemberAccess 标志。

适用于

另请参阅