本篇文章介绍非托管世界里的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类 */