使用.NET应用的Classic COM组件
绑定到COM组件,从.NET应用程序调用它的方法
既然已经生成了.NET客户端要求的元数据,让我们在COM对象中从.NET客户端调用GetAirlineTiming方法。这里有一个简单的C#客户端应用程序,此C#客户端应用程序通过使用元数据(我们先前生成的)创建了COM对象,并且调用GetAirlineTiming方法。第一个方法调用命令应该运行得很顺畅,我们重新得到定期航线"Air Scooby IC 5678".的详情。然后,我们在一个未知的定期航线"Air Jughead TX 1234"中运行,因此COM对象给我们带来我们先前定义的AIRLINE_NOT_FOUND错误。
Collapse这是输出的情况:
.......
String strAirline = "Air Scooby IC 5678";
String strFoodJunkieAirline = "Air Jughead TX 1234";
try
{
AirlineInfo objAirlineInfo;
objAirlineInfo = new AirlineInfo();
// 调用 GetAirlineTiming() 方法
System.Console.WriteLine("Details for Airline {0} --> {1}",
strAirline,
objAirlineInfo.GetAirlineTiming(strAirline));
System.Console.WriteLine("Details for Airline {0} --> {1}",
strFoodJunkieAirline,
objAirlineInfo.GetAirlineTiming(
strFoodJunkieAirline));
}
catch(COMException e)
{
System.Console.WriteLine("Oops an error occured !. Error Code is : {0}.
Error message is : {1}",e.ErrorCode,e.Message);
}
Details for Airline Air Scooby IC 5678 --> 16:45:00 - Will arrive at Terminal 3在更深入的层面,运行库虚构一个运行库可调用的包装 ,此运行库可调用的包装映射元数据代理类型方法,方法的领域,以及由接口(此接口由COM对象执行)显示的属性。为每一个COM 对象实例创建了一个运行库可调用的包装 实例。.NET 执行时期仅仅在乎管理运行库可调用的包装 的生命周期,回收站回收运行库可调用的包装 。运行库可调用的包装处理将引用数保持在被它映射的COM 对象上,因此,能保护.NET 运行库,使它远离管理实际COM 对象上的引用数。正如ILDASM图中所示,AirlineInfo元数据类型被定义在一个被称为AirlineMetadata的命名空间下面。这个类型执行IAirlineInfo 接口。你所要做的就是:通过使用new操作器,仅仅创建一个AirlineInfo 类型实例,并且调用被创建的对象的公共类型方法。当调用了方法时,运行库可调用的包装形实转换这个调用到相应的COM 方法。运行库可调用的包装也处理所有的封送拆收和对象生命周期问题。对于.NET客户端,除了实际上创建一个托管对象,调用其中一个公共类型成员以外,它没有作其他事情。无论什么时候,当COM方法引起一个错误时,COM错误会被运行库可调用的包装限制,此错误会被转换成对等的COMException类型(可以在System.Runtime.InteropServices命名空间里找到)当然,COM对象仍然需要执行ISupportErrorInfo和IErrorInfo接口,使这个错误传播能运行工作,因此运行库可调用的包装知道对象提供了扩展错误信息。.NET客户端使用平常的try-catch异常处理机制检查错误,并且此错误能访问得到实际错误数目、描写,异常的来源以及其它任何COM感知客户端能利用到的详情。你也能返回标准HRESULTs,运行库可调用的包装将它们映射到相应的.NET异常,并返回到客户端。例如:如果想从COM方法返回一个E_NOTIMPL的HRESULT,运行库可调用的包装将会把它映射到.NET NotImplementedException异常,并且引发那个类型的异常。
Oops an error occured !. Error Code is : -2147221502.
Error message is : Airline Timings not available for this Airline
请阅读这篇文章中的Exception Handling那一部分,可以了解更多的关于.NET是怎样被映射到COM HRESULTs.的知识。
0
相关文章