您好 我有一个非常小的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#中使用它吗?
答案 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();