使用.NET应用的Classic COM组件
访问其他支持接口以及动态类型查询
从.NET客户端的角度来看,如果COM对象执行一个特定的接口,它需要检查时,经典的QueryInterface方案是怎样工作的。对于另一个接口的QI,你所要做的就是把对象转换到你正在质疑的接口,如果它成功了,voilà, 你的 QI也就成功了。万一你想把对象转换到对象所不支持的某种任意接口,就要引发一个System.InvalidCastException异常,暗示QI失败了。这个很简单。运行库可调用的包装做简单外表下面所有做枯燥的工作。当你为另一个相联系的类型对象创建一个对象类型时,它就像VB运行库一样,使得不需要编写任何与显式QueryInterface相关联的代码,就能简单地创建QI。
如果当前拥有的对象实例支持或者执行一个特定接口类型,此时另一个可选择的检查方案就是:使用C#'s 'is' operator。'is' operator操作执行时检查,看对象能否安全地转换到一个特定的类型中。如果结果证明是正确的,然后你可以安全地执行一个转型,完成QI。通过这种方法,运行库可调用的包装使你相信你正在转型到接口(这些接口被COM对象操作),而不是任何任意接口类型。你也可以使用C#'s 'as' operator,从一个类型转型到另一个相容的类型(正如下面的例子所示)。这些简单的构造是你在接口之间所要保持的转换,而COM对象以类型安全方式支持这些接口。
Collapse下面是输出的情况:
.......
try
{
AirlineInfo objAirlineInfo = null;
IAirportFacilitiesInfo objFacilitiesInfo = null;
// 创建一个新的AirlineInfo 对象
objAirlineInfo = new AirlineInfo();
// 引用 GetAirlineTiming 方法
String strDetails = objAirlineInfo.GetAirlineTiming(strAirline);
// 检查AirlineInfo对象是否支持(C#的IS操作)IairportFacilitiesInfo的接口
if(objAirlineInfo is IAirportFacilitiesInfo)
{
objFacilitiesInfo = (IAirportFacilitiesInfo)objAirlineInfo;
objFacilitiesInfo = objAirlineInfo as IAirportFacilitiesInfo;
//引用IairportFacilitiesInfo接口上的一个方法
System.Console.WriteLine("{0}",
objFacilitiesInfo.GetInternetCafeLocations());
}
// 检查任意接口类型
if(objAirlineInfo is IJunkInterface)
{
System.Console.WriteLine("We should never get here ");
}
else
{
System.Console.WriteLine("I'm sorry I don't implement" +
" the IJunkInterface interface ");
}
IJunkInterface objJunk = null;
objJunk = (IJunkInterface)objAirlineInfo;
}/* 结束try */
catch(InvalidCastException eCast)
{
System.Console.WriteLine("Here comes trouble" +
" ... Error Message : {0}",
eCast.Message);
}/* 结束 catch */
.......
Your nearest Internet Cafe is at Pavilion 3 in Terminal 2 -
John Doe's Sip 'N' Browse Cafe
I'm sorry I don't implement the IJunkInterface interface
Here comes trouble ... Error Message :
An exception of type System.InvalidCastException was thrown.
0
相关文章