2011-01-21 9 views
3

こんにちは 私は非常に小さなvb.netプロジェクトを作っていますが、VBプロジェクトではイベントを処理するために専用のcomオブジェクトを使用しています。vb.netからc#help

私は、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"); これは同じままで、Googleは私が今働いて手に入れた エラー名「相互作用は、」現在のコンテキスト – Adrian

答えて

4

VB.NETのWithEventsキーワードにはC#でアナログが含まれていません。 IIRC、VB.NETはすべてのWithEvents変数をプロパティに変換し、setterではC#のように明示的にイベントハンドラをアタッチ/デタッチします。

C#にはこの機能がないので、これを自分自身で把握する必要があります。オブジェクトを明示的に作成するので、これを行うのは難しいことではありません。あなたが処理したいイベントごとに行う必要があるでしょうすべては、次のとおりです。

PM.EventName += new EventHandlerType(EventHandlerMethodName); 

ほとんどの場合、EventHandlerTypeは、コンパイラによって推論することができるので、あなたはそれを含める必要はありません。つまり、コードは次のようになります。

PM.PreResponse += this.PreResponse 
+0

ありがとう、あなたが言ったように上に与えられたVB - > C#の翻訳で、彼らが助けてくれた同様のコメントを投稿した他のすべての人に感謝します。 しかし、上記のようにコンパイルする前にまだ問題が1つあります。 – Adrian

1

WithEventsはC#で与えられています。それはVB.Netにあるように特別な考慮事項として必要ではありません。 PreResponseのためにハンドルを追加するには、あなたの負荷または(あなたがasp.netやリサイズを使用している場合に応じて)のinitイベントでは、イベントハンドラに

PM.Response += PreResponse; 

EDITを追加する必要があります。@Adam Robinson年代をなだめるために意味論的ニーズ(意味論的世界に住んでいるからそうである)

WithEventsは、開発者がHandlesキーワードにアクセスできるようにします。この構造体は実際にはC#では存在しません。なぜなら、イベント処理は一方的にしか処理されず、委譲の明示的な定義(WithEventsキーワードなしでVB.Netでも利用可能です)だからです。

+0

Err、いいえ、WithEvents' *はC#では存在しません。 –

+0

"存在しません" v "は指定されています"彼らはどちらも沸き起こる。「それは必要ではない」 –

+0

私はそれに同意しません... "あなたはそれを心配する必要はありません"、もうひとつは "あなたはそれをすることができない、*あなたは何か他のことをしなければなりません。 –

2

C#にはhandlesの構文がありません。

あなたは(FormLoadedに)コードのあなたのイベントをフックすることができます:ハンドルについて

PM.PreResponse += this.PreResponse; 
1

が、何をPM.PreResponse?

PM.PreResponse += PreResponse; 

ます。private voidのButton1 Click ...

PM = CreateObject("ObjName.PManager") 

PM = new comObj.PManager();