技术开发 频道

在非托管事件接受里处理来自于.NET 组件的事件


    本篇文章介绍非托管世界里的COM 对象通过使用Connection Points是怎样异步引起事件的,以及这些事件是怎样被.NET应用程序使用的方法,即我们将得到一个.NET组件来引起事件,然后让非托管接受来使用这些事件。一个.NET组件应该宣告事件,此事件在它的输出事件接口中代表每一个方法的委托实例。当引起事件时,就会调用事件表里的所有委托。这些委托引用通知目标处理程序,因此能呼叫由订户提供的正确的处理程序功能。非托管接受从事预定事件的工作,好像它在与COM 对象交流,此COM 对象支持输出接口使用连接点. COM可调用的包装处理映射事件处理模式,因此,当托管 .NET 事件发生时,COM 客户端的非托管处理程序仍然能够接受通知。

创建一个触发事件的.NET组件

    创建一个.NET组件,在恶劣的天气情况中通知客户。这个组件允许天气预报站设置被记录的风速度。如果风速超过一定的限制(300 mph),它能感觉到即将来临的龙卷风,通过发射OnTornadoWarning事件来通知客户。
Collapse 
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Diagnostics;


[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITornadoWatchEvents
{
void OnTornadoWarning(int nWindSpeed);

}/* 结束接口ITornadoWatchEvents */


public interface IWeatherNotify {

int WindSpeed { get; set; }

}/* 结束接口IWeatherNotify */


public delegate void TornadoWarningDelegate(int nWindSpeed);


[
ComSourceInterfaces("ITornadoWatchEvents"),
ClassInterface(ClassInterfaceType.None)
]
public class WeatherNotify : IWeatherNotify
{
private int m_nWindSpeed = 20;

public event TornadoWarningDelegate OnTornadoWarning;

// 构造器
public WeatherNotify() {
}

public int WindSpeed
{
get {

// 返回当前风速
return m_nWindSpeed;
}

set {

// 为风速设置新值
m_nWindSpeed = value;

if(value >= 300) {

try {

if(null != OnTornadoWarning) {

OnTornadoWarning(m_nWindSpeed);

}
}
catch(Exception ex) {

Trace.WriteLine(ex.Message);
}
}

}

}

}/* 结束WeatherNotify类 */
0
相关文章