使用.NET应用的Classic COM组件2007-11-19 11:22:10 来源:IT168.com 作者:微山 点击:
在熟悉了.NET Beta 1 & Beta 2 bits之后,大部分开发者都会赞同这样的观点:对于企业来说,.NET 技术绝对是创建组件和分布式系统的强有力的方法。 ![]() 简介 在熟悉了.NET Beta 1 & Beta 2 bits之后,大部分开发者都会赞同这样的观点:对于企业来说,.NET 技术绝对是创建组件和分布式系统的强有力的方法。但是,我们又该如何看待在过去的日子里早已创建的那些可再度使用的大量COM组件,更不用说创建这些组件时你所花的物力人力还有你所付出的那些无眠的夜晚,它是.NET 世界中所有组件的终结吗?这些组件将会和.NET 托管运行库一起为我们工作吗? 对于那些靠编写COM组件来谋生的人,以及那些唱着“COM就是爱”这首颂歌的人来说,这里有一个好消息。COM组件仍然会继续下去,.NET 托管应用程序可以兼容现有的COM 组件。当然,微软不会强迫公司禁止它们现有的组件,尤其是那些以使用得最广泛的对象模式这一方法编写的组件(这些组件是为了开发桌面和分布式应用程序而设计的)。Classic COM 组件通过一个interop 层与.NET 运行库进行互操作,此interop 层将处理信息转化之间的所有plumbing ,这些转化信息在托管运行库和COM 组件(此COM 组件操作非托管领域)之间循环运行,反之亦然。 现在,让我们看一下另一个方面。如果你决定使用以通用语言执行层为目标的.NET友好语言编译你的组件,而且仍然需要使用这些来自于COM 感知客户端(例如:VB 6.0 或者Classic ASP)的.NET 组件时,将会发生什么情况?更多的将是失望的对待非. COM 感知客户端,而并非愉快的通过COM Interop 与.NET 组件合作。附带有.NET 结构的工具允许你向COM感知客户端展示.NET 组件,好像它们就是普通的COM 组件。COM Interop 处理covers 下面所有枯燥乏味的工作和plumbing 。在文章的第一部分,我们将重点集中于:怎样可以使COM组件和.NET一起工作,然后在后面的部分,我们将研究在非托管世界中怎样才能使用来自于COM客户端的.NET组件。在文章的末尾部分,希望你具备足够的基础知识,能理解Classic COM 和.NET结构怎样才能和平共处,一起发挥作用。那么,如果你已经准备好了,让我们一起来探讨Classic COM是怎样与.NET世界里的各大方案相匹配的。 使用.NET应用程序的Classic COM 组件 开始 怎样向.NET应用程序展示一个Classic COM组件?任务的第一个原则就是使用ATL(此ATL为特定定期航线提供抵达详情)编写一个简单的COM组件。为了简洁一点,我们仅仅为'Air Scooby IC 5678'定期航线返回一些详情,而给其它航线提供的是错误。通过这种方法可以看到:由COM组件引起的错误是怎样传回来,并且被.NET客户端应用程序发现调用的。 下面是IAirlineInfo接口的IDL定义。 interface IAirlineInfo : IDispatch 这里是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; }
undefined
undefined ![]()
|
|
||||
|
|
||||
|
|
|
||||
|
|
||||
|
|
|
||||
|
|
||||
|
|