技术开发 频道

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


    让我们仔细解析这个代码,试图理解正在发生的事情。ITornadoWatchEvents 接口是输出接口 ,非托管接受需要执行此输出接口 ,为了接受事件通知。这个接口由一个单方法OnTornadoWarning 组成,此单方法OnTornadoWarning 通知客户端龙卷风可能即将到来,也通知了当前的风速。注意:输出接口 ITornadoWatchEvents 被标记有InterfaceType attribute ,而InterfaceType attribute 上有位置参数ComInterfaceType.InterfaceIsIDispatch.。这是因为接口会默认地转移到IDL 中,然后再作为双重接口转移到类型库中。当它们试图在双重接口中接受时,一般脚本客户端会崩溃。,它们仅仅是友好纯分配界面。因此我们使用ComInterfaceType.InterfaceIsIDispatch 值注入一个InterfaceType 属性,强迫类型库工具为输出接口生成一个纯分配界面 。

    你必须定义一个委托 (TornadoWarningdelegate),此委托 (TornadoWarningdelegate)与输出接口里的OnTornadoWarning方法标记式,完全匹配。如果在输出接口中拥有不止一个方法,必须为每一个方法定义相匹配的委托。现在已经定义了输出接口,并且为输出接口里的每一个方法找到了相匹配的委托。现在就是最重要的部分。你必须定义事件,代表在输出接口中为每一个方法所定义的委托。
public event TornadoWarningdelegate OnTornadoWarning;
    事件代表的委托实例需要拥有和输出接口里相对应的方法。这意味代表TornadoWarning,委托实例中的的event需要被命名为OnTornadoWarning。这就是它所要做的。现在你已经准备发送事件通知了。在例子中,当WindSpeed被设置到一个等于或者大于300的值时,就发送了通知。首先,如果存在事件的委托实例时,必须检查它,然后发送OnTornadoWarning事件。因为被event代表的委托是一个多点传送委托,所有的COM 接受者以及委托调用列表中的客户将会被通知到:地平线上隐隐约约有一个难题。你可以使用下面命令,创建上面的.NET组件。

csc /target:library /r:System.dll /out:WeatherNotify.dll WeatherNotify.cs
    你可以在RegAsm.exe上运行程序集,并注册它,在它外面生成类型库。在VB6客户端中可以引用类型库,VB6客户端会接受事件。
regasm WeatherNotify.dll /tlb:WeatherNotify.tlb
处理VB6客户端应用程序中的事件

    这里有一个VB 6.0客户端,它从WeatherNotify组件中预定OnTornadoWarning事件通知。它是一个简单的基于Form的应用程序,通过使用WithEvents关键词,此基于Form的应用程序预定事件通知。当WindSpeed 被设置成一个等于或者大于300时,objWeatherNotify_OnTornadoWarning子程序从.NET组件接受事件通知。



Collapse 
Dim WithEvents objWeatherNotify As WeatherNotify.WeatherNotify

Private Sub Form_Load()
Set objWeatherNotify = New WeatherNotify.WeatherNotify
End Sub

Private Sub SetWindSpeedButton_Click()

Me.LabelWarning = ""

objWeatherNotify.WindSpeed = Me.WindSpeed

End Sub

Private Sub objWeatherNotify_OnTornadoWarning(ByVal nWindSpeed As Long)

Me.LabelWarning = "Tornado Warning: Current Wind Speeds : " & _
nWindSpeed & " mph"

End Sub
    先前知道运行库可调用的包装和元数据帮助程序类型是怎样翻译连接点事件,以此来处理基于委托的事件处理语法,因此.NET应用程序可以从COM 组件接受事件。同样,在这里,COM可调用的包装做绝大部分艰苦的工作,允许非托管代码从.NET 组件预定事件通知,把这些事件运输到非托管 COM领域里各自的处理程序中。
0
相关文章