技术开发 频道

从感知客户端使用.NET 组件:创建一个.NET组件


    下面是被生成的类型库中相应的IDL文件的例子。注意,现在TemperatureComponent类型默认接口是由类型执行的ITemperature接口。
Collapse 

[
uuid(A9F20157-FDFE-36D6-90C3-BFCD3C8C8442),
version(1.0)
]
library Temperature
{
......

[
odl,
uuid(72AA177B-C6B2-3694-B083-4FF535B40AD2),
version(1.0),
dual,
oleautomation,
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "ITemperature")
]
interface ITemperature : IDispatch {
[id(0x60020000), propget]
HRESULT Temperature([out, retval] single* pRetVal);
[id(0x60020000), propput]
HRESULT Temperature([in] single pRetVal);
[id(0x60020002)]
HRESULT DisplayCurrentTemperature();
[id(0x60020003)]
HRESULT GetWeatherIndications([out, retval]
WeatherIndications* pRetVal);
};

[
uuid(01FAD74C-3DC4-3DE0-86A9-8490FAEE8964),
version(1.0),
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9},
"TemperatureComponent")
]
coclass TemperatureComponent {
interface _ Object;
[default] interface ITemperature;
};
};
    将.NET类型的方法明确地转变成接口的方法,以及从接口派生类型和执行类型的方法都是非常值得推荐的方法,以此来向你的COM 感知客户端展示你的.NET 组件。ClassInterfaceType.None选择告诉类型库生成工具不需要一个类型接口。这就保证ITemperature接口就是默认接口。不为类型接口属性指定ClassInterfaceType.None值,然后类型接口就会创建成默认接口。这是我们在这章所学的要点。

   • 附带有类型接口的ClassInterfaceType.AutoDual不了解COM版本。尽量避免使用。
   • 附带有ClassInterfaceType.AutoDispatch的类型接口不会把类型信息和DISPIDs转移到类型库。它们是友好COM 译本。仅仅通过晚期绑定,可以从COM 感知客户端的访问。
   • 类型接口是一个低劣的接口。可能的话,尽量避免。相反使用显式接口。
   • 使用ClassInterfaceType.None,将显式接口转变成默认接口。

    另外一个有趣的发现就是:在.NET类型或者接口(正在将此.NET类型或者接口转到类型库中)超载方法时,通过添加一个'_'('_'后面是一序列数字),REGASM 和TLBEXP在IDL中生成mangled方法名称的方法。例如:如果在.NET 组件中展示了下面的接口。
public interface MyInterface
{
String HelloWorld();
String HelloWorld(int nInput);
}
   然后,与类型库相对应的IDL(此IDL是由REGASM/TLBEXP生成的)如下:
[ 
.....
]
interface MyInterface : IDispatch {

[id(0x60020000)]
HRESULT HelloWorld([out, retval] BSTR* pRetVal);

[id(0x60020001)]
HRESULT HelloWorld_2([in] long nInput,
[out,retval] BSTR* pRetVal);
};
    注意,要把被添加到第二个HelloWorld方法的'_2'与IDL文件中的第一个'_2'相区分开来。
0
相关文章