技术开发 频道

使用.NET应用的Classic COM组件


   这里是GetAirlineTiming方法的执行情况。
CAirlineInfo::GetAirlineTiming(BSTR bstrAirline, BSTR *pBstrDetails) 
{
_bstr_t bstrQueryAirline(bstrAirline);
if(NULL == pBstrDetails) return E_POINTER;

if(_bstr_t("Air Scooby IC 5678") == bstrQueryAirline)
{
*pBstrDetails = _bstr_t(_T("16:45:00 - Will arrive at Terminal 3")).copy();

}
else
{
return Error(LPCTSTR(_T("Airline Timings not available for this Airline" )),
__uuidof(AirlineInfo), AIRLINE_NOT_FOUND);
}
return S_OK;

}
    熟悉了组件之后,让我们看一下怎样从组件类型库生成某种元数据,从而.NET客户端可以使用这个元数据与组件对话,并且调用它的方法。

从COM类型库生成元数据



    与COM组件对话的.NET应用程序不能直接地使用这个它的功能。因此需要生成某种元数据。运行库使用这个元数据层,以此来收集类型信息,从而它可以在运行时使用这个类型信息,生产所谓的Runtime Callable Wrapper (运行库可调用的包装)。 运行库可调用的包装处理COM 对象的实际激活,而且当.NET应用程序与它相作用时,处理marshaling要求。运行库可调用的包装 也做其它大量的琐碎的事情,例如:操作标识对象,标识生命周期,以及接口缓存。在这里,对象生命周期管理是一个非常重要的问题,因为.NET 运行库不停地移动对象,回收站则回收。运行库可调用的包装提供了下面这一服务——它通知.NET应用程序,它正在与托管 .NET组件相互作用,并在非托管空间中提供COM组件,并且它让.net应用程序给人们一个印象——.net应用程序是一个优秀的使用了很久的COM客户端。运行库可调用的包装的创建和行为随着你是前期绑定还是晚期绑定到COM对象而不同。在看似简单的背后,运行库可调用的包装正在做所有困难的事情,把所有方法调用都形实转换成相应的虚函数表呼叫,再转移到COM组件中,此COM组件属于非托管世界。它是托管世界和非托管IUnknown世界之间的友善大使。

    让我们为Airline COM组件生成一个元数据包装器。为了完成这一目标需要使用一个被称为TLBIMP.exe的工具,The Type library Importer (TLBIMP)与.NET结构SDK一起运行,在你的SDK安装的Bin子文件夹中可以找到Type library Importer (TLBIMP)。Type library Importer (TLBIMP)工具阅读一个类型库,生成相应的元数据包装器,此元数据包装器包括.NET运行库所能支持的类型信息。

0
相关文章