2011-01-21 53 views
3

嗨 我有一个工作非常小的vb.net项目,但它使用一个专有的com对象,这是在VB项目中有线来处理事件!vb.net到C#帮助

我已经改变了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 

上面的代码创建对象被点击的按钮,每当对象获得的数据也引发一个事件时,将数据传递到传输前或接收前。

我只是不能似乎找出如何做到这一点的C#

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; 
} 

但什么把手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#中使用它吗?

+2

你尝试过一个转换器,如:http://www.developerfusion.com/tools/convert/vb-to-csharp/ – Matt

+0

@Matt - 我的最爱之一。 –

+0

感谢这显然得到了它的大部分,但一行我仍然有一个问题,阻止我编译它。 PM = Interaction.CreateObject(“ObjName.PManager”); 这仍然相同,谷歌表示,其在Microsoft.VisualBasic程序命名空间 但是我得到 错误名称“互动”不存在当前上下文 – Adrian

回答

4

VB.NET的WithEvents关键字在C#中没有模拟。 IIRC,VB.NET将所有WithEvents变量转换为属性,然后在设置器中,它像您在C#中看到的那样明确地附加/分离事件处理程序。

由于C#不具备此功能,因此您必须自行跟踪此问题。既然你明确地创建了对象,这应该不难做到。所有你必须对要处理的每个事件做的是:

PM.EventName += new EventHandlerType(EventHandlerMethodName); 

在大多数情况下,EventHandlerType可以通过编译器来推断,所以你不需要把它列入。这意味着你的代码可以变成:

PM.PreResponse += this.PreResponse 
+0

谢谢你和所有其他人发表了类似的评论,他们已经提供了帮助,并在上面给出的VB - > c#translate中按照你的说法做了。 但是,我仍然有一个问题,才能编译为上述评论。 – Adrian

1

WithEvents是C#中给出的。它不是必需的,因为它在VB.Net中。要添加手柄的PreResponse,在你的负载或init事件(取决于如果您正在使用asp.net或WinForms的),你需要添加事件处理

PM.Response += PreResponse; 

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

WithEvents为开发人员提供了访问Handles关键字的权限。实际上,C#中并不存在这种结构,因为事件处理只能以单一方式处理,并且与委托的显式定义(在没有WithEvents关键字的情况下也可在VB.Net中使用)有关。

+0

错误,不,'WithEvents' *在C#中不存在*。 –

+0

“不存在”v“是给定的”。他们都归结为:“这不是必要的。” –

+0

我不同意......一个归结为“你不需要担心”,另一个归结为“你不能这样做,*所以你必须做其他事情*。” –

2

C#不具备handles语法。

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

PM.PreResponse += this.PreResponse; 
1

但什么把手PM.PreResponse?

PM.PreResponse += PreResponse; 

私人无效的button1_Click ...

PM = CreateObject("ObjName.PManager") 

相同

PM = new comObj.PManager();