【问题标题】:Handling events with C# raised from VB.NET使用 C# 处理从 VB.NET 引发的事件
【发布时间】:2014-09-26 14:17:43
【问题描述】:

我正在尝试管理一些事件。

我有我的主要项目,用 C# 编写,我添加了另一个项目,用 VB.NET 编写。

在 VB.NET 项目中,我有一个类,引发一个事件:

Public Class newMessageArgs
    Inherits EventArgs
    Public Property messageCode As String
    Public Property appName As String
End Class

Public Class EventRaiser

    Event NewMessage As EventHandler

    Sub MessageEvent(ByVal typeEvent As String, ByVal messageCode As String, appName As String)
        If typeEvent = "newMessage" Then
            Dim args As newMessageArgs = New newMessageArgs()
            args.appName = appName
            args.messageCode = messageCode
            RaiseEvent NewMessage(Me, args)
        End If
    End Sub
End Class

引发事件的方法是从我的 VB.NET 代码中调用的,但我必须使用我的 C# 代码来处理它。我该怎么做?

此事件未绑定到任何 xaml 元素。

代码更新:

尝试处理事件:

截图:http://imgur.com/JmdA7YM

attivazione.EventRaiser raiser = new attivazione.EventRaiser();

raiser.NewMessage += raiser_NewMessage; //error: "no overloads for raiser_NewMessage matches the delegate system.eventhandler", underlining red raiser_NewMessage



private void raiser_NewMessage(object sender, newMessageArgs e)
{
   //handle your event here
}

Attivazione 是 VB.NET 中引发事件的类的名称。

【问题讨论】:

  • 它所用的语言应该不重要。你到底遇到了什么问题?
  • 简单地说:我该怎么做?如何从另一个项目中查看事件?如何在 C# 中声明事件处理程序并读取参数?
  • @PieroAlberto 与添加任何其他事件处理程序的方式相同。
  • @PieroAlberto 这些单独的项目适合一些人吗?

标签: c# .net vb.net events raiseevent


【解决方案1】:

修改您的 VB 代码以使用与“newMessageArgs”完全匹配的委托:

Public Delegate Sub CustomEventHandler(ByVal sender As Object, ByVal e As newMessageArgs)
Public Event NewMessage As CustomEventHandler

【讨论】:

    【解决方案2】:

    您的vb.net 代表签名不正确。您需要创建一个与您的事件参数匹配的NewMessage 委托。

    Public Class NewMessageEventArgs
        Inherits EventArgs
    
        Public Property MessageCode As String
        Public Property AppName As String
    
    End Class
    
    Public Delegate Sub NewMessageEventHandler(sender As Object, e As NewMessageEventArgs)
    
    Public Class EventRaiser
    
        Public Event NewMessage As NewMessageEventHandler
    
        Public Sub MessageEvent(ByVal typeEvent As String, ByVal messageCode As String, appName As String)
            If (typeEvent = "newMessage") Then
                RaiseEvent NewMessage(Me, New NewMessageEventArgs() With {.AppName = appName, .MessageCode = messageCode})
            End If
        End Sub
    
    End Class
    

    【讨论】:

      【解决方案3】:

      你打算这样做吗?

      var raiser = new EventRaiser();
      raiser.NewMessage += raiser_NewMessage;
      
      private void raiser_NewMessage(object sender, EventArgs e)
      {
          //handle your event here
      }
      

      newMessageArgs 类和NewMessage 事件应该在您的 VB 代码中公开。

      当然,您应该使用 VB 代码将程序集的引用添加到 C# 项目中。

      【讨论】:

      • @PieroAlberto 您是否在您的 VB 代码中公开了 newMessageArgs 和 NewMessage 事件?你到底遇到了什么错误?
      • 是的,它们是公开的,您可以在问题中看到。
      • 它说 raiser 不包含 NewMessage 的定义
      • @PieroAlberto 检查您输入的代码。在您的问题中,您写了raiser.NewMesssage - 带有三个's'。如果在您的代码中是这样 - 那就是错误来源。 ;)
      • 嗯,你是对的......但是现在错误已经改变了! :( "没有为 raiser_NewMessage 重载匹配委托 system.eventhandler",下划线红色 raiser_NewMessage
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多