2011-01-21 88 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();