DynamicMethod.Invoke 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
使用具有指定区域性信息的指定绑定器约束下的指定参数调用动态方法。
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 对象。
binder如果是null,则使用默认绑定器。 如需了解详情,请访问 Binder。
- parameters
- Object[]
参数列表。 这是一个参数数组,其数字、顺序和类型与要调用的方法的参数相同。 如果没有参数,则此参数应为 null。
- culture
- CultureInfo
用于控制类型的强制的实例 CultureInfo 。 如果是, null则 CultureInfo 使用当前线程。 例如,需要此信息才能正确将表示 1000 的值转换为 String 值 Double ,因为 1000 由不同的区域性以不同的方式表示。
返回
一个 Object 包含已调用方法的返回值。
例外
VarArgs不支持调用约定。
中的 parameters 元素数与动态方法中的参数数不匹配。
一个或多个元素 parameters 的类型与动态方法的相应参数的类型不匹配。
动态方法与模块关联,不是匿名托管的,并且构造的skipVisibility设置为 false,但动态方法访问非 public 或 internal (Friend in Visual Basic) 的成员。
-或-
动态方法是匿名托管的,并且构造为
-或-
动态方法包含无法验证的代码。 请参阅“备注 DynamicMethod”中的“验证”部分。
示例
下面的代码示例使用美国英语文化调用具有确切绑定的动态方法。 该代码示例是 DynamicMethod 类中的一个较大示例的一部分。
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。 另一方面,如果创建一个设置为restrictedSkipVisibilitytrue这样可以访问目标程序集的隐藏成员的方法,该方法将导致对目标程序集的权限以及ReflectionPermissionReflectionPermissionFlag.MemberAccess标志的需求。