vb.net到c#help

时间:2011-01-21 17:45:41

标签: c# vb.net

您好   我有一个非常小的vb.net项目,但是它使用了一个专有的com对象,它连接在VB项目中来处理来自它的事件!

我已更改com对象的名称,但语法上以下代码是正确的:

Public Class Form1
Private WithEvents PM As comObj.PManager
Delegate Sub SetTextCallback([text] As String)



Private Function PreTransmit(ByVal s As String) As String Handles PM.PreTransmit
    Me.SetText(s)
    Return s
End Function

Private Function PreResponse(ByVal s As String) As String Handles PM.PreResponse
    Return s
End Function
Private Sub SetText(ByVal [text] As String)

    If Me.textBox1.InvokeRequired Then
        Dim d As New SetTextCallback(AddressOf SetText)
        Me.Invoke(d, New Object() {[text]})
    Else
        Me.textBox1.Text = [text]
    End If
End Sub


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    PM = CreateObject("ObjName.PManager")
End Sub
End Class

上面的代码在单击按钮时创建对象,每当对象获取数据时,它都会引发一个事件,将数据传递到pretransmit或preceive。

我似乎无法弄清楚如何做到这一点#

VB

Private WithEvents PM As comObj.PManager

C#

private comObj.PManager PM;

但是WithEvents呢?

VB

Private Function PreResponse(ByVal s As String) As String Handles PM.PreResponse
        Return s
End Function

C#

private string PreResponse(string s)
{
    return s;
}

但是Handles PM.PreResponse呢?

VB

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        PM = CreateObject("ObjName.PManager")
End Sub

C#

private void Button1_Click(System.Object sender, System.EventArgs e)
{
    PM = Interaction.CreateObject("ObjName.PManager");
}

不确定我出错了??

我可以编写一个vb.net类并在c#中使用它吗?

4 个答案:

答案 0 :(得分:4)

VB.NET的WithEvents关键字在C#中没有模拟。 IIRC,VB.NET将所有WithEvents变量转换为属性,然后在setter中它显式地附加/分离事件处理程序,就像你在C#中看到的一样。

由于C#没有此功能,您必须自己跟踪。由于您是明确创建对象,因此这应该不难。您要为每个要处理的事件做的就是:

PM.EventName += new EventHandlerType(EventHandlerMethodName);

在大多数情况下,编译器可以推断EventHandlerType,因此您不需要包含它。这意味着您的代码可以变成:

PM.PreResponse += this.PreResponse

答案 1 :(得分:2)

C#没有handles语法。

您可以在代码中连接事件(在FormLoaded中):

 PM.PreResponse += this.PreResponse;

答案 2 :(得分:1)

WithEvents是C#中给出的。没有必要像VB.Net那样特别考虑。要在load或init事件中添加PreResponse的句柄(取决于你使用的是asp.net还是winforms),你需要添加事件处理程序

PM.Response += PreResponse;

编辑:安抚@Adam Robinson的语义需求(因为我们生活在一个语义世界中)。

WithEvents使开发人员可以访问Handles关键字。事实上,这种结构在C#中不存在,因为事件处理只处理一种方式,而且是委托的明确定义(在没有WithEvents关键字的情况下也可以在VB.Net中使用)。

答案 3 :(得分:1)

但是Handles PM.PreResponse呢?

PM.PreResponse += PreResponse;

private void Button1_Click ...

PM = CreateObject("ObjName.PManager")

相同
PM = new comObj.PManager();