晚(后)期绑定:若将一个变量声明为object,编译时不知道程序集是否存在,也无法确定该变量将引用哪种类型的对象,在程序中创建该程序集指定类型的实例,并调用其成员,这就是晚期绑定。
在运行时确定对象的属性和方法能否使用该变量。对进程外部件而言,这意味着一次额外的跨进程方法调用,增加额外开销。
在调用外部的COM自动化组件时,如Office,如果通过这种方式调用,对于不同版本的Office,如果你调用的方法、属性都是存在的,那么可以适应不同版本的Office,但如果通过前期绑定,在项目引用中确定对象类型,是有版本兼容问题的。
早(前)期绑定:当显式声明了变量的类时,例如 As Int32,该变量就只能存放该类的对象的引用,在编译时就能知道属性或方法所属的对象。
本例程序首先定义3个外部类项目OldClass,NewClass,MyClass,并编译为dll程序集,建立一个主程序项目LateBinding,添加3个外部类项目的dll引用。
第一个外部类项目OldClass:
第二个外部类项目NewClass:
第三个外部类项目MyClass:
主程序类项目LateBinding:
一、LoadOldClass()方法和LoadNewClass()方法的晚期绑定通过如下的InvokeMember()方法调用指定对象的成员。
//调用Type对象oldTp的InvokeMember方法,传递相应的参数,方法返回为Object类型,使用转换为string
string txt = (string)oldTp.InvokeMember("Method", BindingFlags.InvokeMethod, null, null, oldList);
InvokeMember方法:
public Object InvokeMember (
string name,
BindingFlags invokeAttr,
Binder binder,
Object target,
Object[] args
)
参数:
name
String类型,它包含要调用的构造函数、方法、属性或字段成员的名称。
- 或 - 空字符串 (""),表示调用默认成员。
- 或 -对于 IDispatch 成员,则为一个表示 DispID 的字符串,例如“[DispID=3]”。
invokeAttr
一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public |BindingFlags.Instance。
binder
一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
- 或 -
若为空引用(在 Visual Basic 中为 Nothing),则使用 DefaultBinder。
target
要在其上调用指定成员的 Object。
args
包含传递给要调用的成员的参数的数组。
返回值
表示被调用成员的返回值的 Object。
二、LoadMyClass()方法的晚期绑定通过如下代码调用指定对象的成员。
//通过myTp.GetMethod()搜索参数指定的方法
MethodInfo mi = myTp.GetMethod("Method");
//定义仅一个参数的数组(因调用的NewClass类中的方法Method()只有一个参数)
string[] myList = new string[1] { input };
//调用MethodInfo对象mi的Invoke方法,传递相应的参数,方法返回为Object类型,使用转换为string
string txt = (string)mi.Invoke(myObj,myList);
Invoke方法:
public Object Invoke(
Object obj,
Object[] parameters
)
参数
obj
类型:System.Object
对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
parameters
类型:System.Object[]
调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters 应为 null。
如果此实例所表示的方法或构造函数采用 ref 参数(在 Visual Basic 中为 ByRef),使用此函数调用该方法或构造函数时,该参数不需要任何特殊特性。如果数组中的对象未用值来显式初始化,则该对象将包含该对象类型的默认值。对于引用类型的元素,该值为 null。对于值类型的元素,该值为 0、0.0 或 false,具体取决于特定的元素类型。
返回值
类型:System.Object
一个对象,包含被调用方法的返回值,如果调用的是构造函数,则为 null。
三、创建外部程序集指定类型的实例也可以通过以下方法
//创建当前应用程序域的指定程序集中指定类型的实例
object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("NewClass", "LateBinding.NewClass");
AppDomain.CurrentDomain.CreateInstanceAndUnwrap(“程序集名称”,”命名空间.类名”)