技术开发 频道

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


   然后,由RegAsm.exe生成的相应的类型库将有一个这样的IDL结构。
[ 
uuid(A9F20157-FDFE-36D6-90C3-BFCD3C8C8442),
version(1.0)
]
library Temperature
{
......

[
uuid(01FAD74C-3DC4-3DE0-86A9-8490FAEE8964),
version(1.0),
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9},
"TemperatureComponent")
]
coclass TemperatureComponent {
[default] interface IDispatch;
interface _ Object;
};
};
    你将注意到默认接口是一个IDispatch 接口,在类型库中既没有DISPIDs 也没有方法类型信息。这样只剩下COM 感知客户端使用仅仅使用晚期绑定的.NET 组件 。而且,在类型中,因为DISPID 细节没有被储存作为信息的一部分,通过使用像IDispatch::GetIDsOfNames一样的事物,客户端按要求获得这些DISPIDs。这允许客户端在没有打破现有代码的情况下,使用更加新组件的版本。当发行了更加新组件的版本时,虽然前者仅仅允许晚期绑定,因为它没有打破现有的客户端代码,所以使用ClassInterfaceType.AutoDispatch比使用ClassInterfaceType.AutoDual更加安全。模拟你的.NET组件,并把它展示给COM 感知客户端,完成这一程序值得推荐的方法就是去除类型接口本身,相反,明确地把你正在展示的方法转成分离接口,并且让.NET组件执行那个接口。使用一个类型接口,将你的.NET组件展示给COM 感知客户端,这一方法非常简单,而且非常迅速。但是并不是一种值得推荐的方法。明确地把方法转变成接口,让我们试图重新编写我们的TemperatureComponent,看类型库生成有什么不同:
Collapse 
// 定义ITemperature 接口
public interface ITemperature {

float Temperature { get; set; }
void DisplayCurrentTemperature();
WeatherIndications GetWeatherIndications();

}/* 结束 Itemperature接口 */



[ClassInterface(ClassInterfaceType.None)]
public class TemperatureComponent : ITemperature
{
......

public float Temperature
{
get { return m_fTemperature; }
set { m_fTemperature = value;}

public void DisplayCurrentTemperature() {
.....
public WeatherIndications GetWeatherIndications() {
....
0
相关文章