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
(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 标志。