重用托管代码中的Classic COM 组件
通过混合模式继承重用
在这个重用模式中,可以从非托管 COM类型中扩展或者继承你的托管 .NET类型。除此以外,托管类型可以选择覆盖COM coclass接口里的方法,或者接受基本COM coclass执行。这是一个强有力的模式,你可以在同一类型中混合托管 和非托管执行。

从COM组件的托管类中继承非托管代码
通过看下面的代码片断,来更好地理解。我们将使用ATL建立一个被称为Flyer的COM 对象,此ATL用两种方法支持一个被称为IFlyer的接口,这两种方法就是TakeOff() 和Fly()。下面是组件的IDL声明。
[两个方法的执行情况:
....
]
interface IFlyer : IDispatch
{
[id(1), helpstring("method TakeOff")]
HRESULT TakeOff([out,retval] BSTR* bstrTakeOffStatus);
[id(2), helpstring("method Fly")]
HRESULT Fly([out,retval] BSTR* bstrFlightStatus);
};
[
.....
]
coclass Flyer
{
[default] interface IFlyer;
};
STDMETHODIMP CFlyer::TakeOff(BSTR *bstrTakeOffStatus)在这个组件被托管代码使用之前,你必须从它的类型库为这个组件生成元数据代理。为了完成这一过程,你需要用到命令行中的以下命令。
{
*bstrTakeOffStatus =
_bstr_t(_T("CFlyer::TakeOff - This is COM taking off")).copy();
return S_OK;
}
STDMETHODIMP CFlyer::Fly(BSTR *bstrFlyStatus)
{
*bstrFlyStatus =
_bstr_t(_T("CFlyer::Fly - This is COM in the skies")).copy();
return S_OK;
}
tlbimp MyFlyer.tlb /out:MyFlyerMetadata.dll现在创建托管类型,托管类型是通过使用普通的继承语法从这个组件继承来的,因此这个组件的功能可以被重用。其中一个托管类型—Bird 是从元数据类型(此元数据类型与Flyer COM对象相对应)继承而来的。这意味着它将继承Flyer COM 组件的所有方法。其它托管 类型—Airplane 用它自己的执行覆盖TakeOff 和 Fly 方法。这里的一个警告就是:在你的托管中,你不能有选择地仅仅覆盖来自于COM 类型的特殊方法。如果你决定覆盖你的托管代码内COM 类型中的单一方法,你也要覆盖其它方法。换句话说,你不能仅仅为TakeOff方法提供一个被覆盖的执行,你不能暗中让托管类型使用来自于COM对象的Fly执行。你必须在托管类型中覆盖Fly方法,为它提供一个实作码。如果想重用COM coclass实作码,你可以从托管类型的Fly执行中调用base.Fly。在编译时不需要选择具体的方法。在执行时找到System.TypeLoadException异常而结束,并且附带有一个错误信息:'Types extending from COM 对象s should override all methods of an interface implemented by the base COM class'。
0
相关文章