使用.NET应用的Classic COM组件
后期绑定COM对象
上面看到的所有例子使用了元数据代理前期绑定.NET客户端到COM对象中。前期绑定提供了很多好处,例如:在编译时的类型检查,为工具开发从类型信息中提供了自动完成功能,当然,还有更好的性能,当真正需要晚期绑定Classic COM 对象时,而正在绑定的COM 对象没有编译时间元数据时,这里可能有一些实例。我们可以通过Reflection 机制来晚期绑定COM 对象。这个并不只适合于COM 对象。甚至.NET 托管对象可以被晚期绑定,并且可以通过使用Reflection 来下载。而且,如果对象仅仅执行一个纯调度接口,那样在很大程度上,限制仅仅使用Reflection 来激活对象,调用它的接口上的方法。
对于COM 对象的晚期绑定,必须了解对象的ProgID or CLSID 。System.Activator 类型的CreateInstance静态方法允许你为一个特定的类型指定Type 信息,并且它将自动地创建那个特定类型的对象。但是真正拥有的只有COM 对象的COM ProgID 和 COM CLSID,并没有真正的.NET Typ信息。因此,通过使用System.Type类型的GetTypeFromProgID 或者GetTypeFromCLSID静态方法,我们需要从ProgID or CLSID得到Type 信息。System.Type 类型是Reflection 的其中一个核心推动力量。当使用Activator.CreateInstance,创建了一个对象实例后,使用Type对象(你从Type.GetTypeFromProgID 或者Type.GetTypeFromCLSID中得到的)的System.Type.InvokeMember方法,可以调用对象支持的任何方法/属性。所要知道的就是,方法的名称和属性,调用接受的参数类型。参数被捆绑成一个普通的System.对象阵列,并且被传送给方法。根据你是正在调用一个方法或者还是在创建属性值,你也需要创建正确的binding flags。这就是COM对象晚期绑定的全部内容。
Collapse输出情况如下:
.......
try
{
objAirlineLateBound;
Type objTypeAirline;
// 创建数组容器对象
// 方法的输入参数
[] arrayInputParams= { "Air Scooby IC 5678" };
//获取类型信息
objTypeAirline =
Type.GetTypeFromProgID("AirlineInformation.AirlineInfo");
// .NET 与System.Type的关联
objTypeAirline = Type.GetTypeFromCLSID(new Guid(
"{F29EAEEE-D445-403B-B89E-C8C502B115D8}"));
objAirlineLateBound = Activator.CreateInstance(objTypeAirline);
// 引用'GetAirlineTiming' 方法
String str = (String)objTypeAirline.InvokeMember("GetAirlineTiming",
BindingFlags.Default |
BindingFlags.InvokeMethod,
null,
objAirlineLateBound,
arrayInputParams);
System.Console.WriteLine("Late Bound Call" +
" - Air Scooby Arrives at : {0}",str);
// 获取'LocalTimeAtOrlando' 的值
String strTime = (String)objTypeAirline.InvokeMember("LocalTimeAtOrlando",
BindingFlags.Default |
BindingFlags.GetProperty,
null,
objAirlineLateBound,
new object []{});
Console.WriteLine ("Late Bound Call - Local" +
" Time at Orlando,Florida is: {0}",
strTime);
}/* 结束try */
catch(COMException e)
{
System.Console.WriteLine("Error code : {0}, Error message : {1}",
e.ErrorCode, e.Message);
}/* 结束catch */
.......
Late Bound Call - Air Scooby Arrives at 16:45:00 - Will arrive at Terminal 3
Late Bound Call - Local Time at Orlando,Florida is: Sun Jul 15 16:50:01 2001
0
相关文章