2011-08-16 9 views
5

VB6で.netイベントを処理できるようにする必要があります。これまで私はそれを私にC#クラスCOMを可視化させることによって設定しました。私のVB6オブジェクトは、上のメソッドを呼び出すことができますが、今はVBから.netに通信するための何らかの方法が必要です。もし私のC#クラスにイベントを追加すると、.netラッパーはadd_EventNameとremove_EventNameを追加しているようです。これは、イベントを購読して購読を中止することを前提としています。しかし、私はまだ初心者VB6に来ると私は本当にそれを使用する方法がわからないので来ています。VB6のC#.netイベントを購読する

add_EventNameはEventNameEventHadlerを受け取っているようですが、どうしますか?私はサブを試みたが、これは私にランタイムエラーを与える。誰もこれを使用する方法を知っていますか?

oHost.add_EvalReceived AddressOf EvalReceivedEventHandler 
+0

のように見えることになったとOHOSTは私のCOM見える.NETオブジェクト –

答えて

4

あなたが試みることができる:ここで私は

Private oHost As HostService.IHost 

Private Sub Form_Load() 
    Set oHost = New HostService.Host 
    oHost.Start 
    oHost.add_EvalReceived EvalReceivedEventHandler 
End Sub 

Private Sub EvalReceivedEventHandler(ByVal sender As Variant, ByVal e As EvalReceivedEventArgs) 
MsgBox "Eval Received in VB: " & e.Eval.TimeSent & ":" & e.Eval.FirstName & " " & e.Eval.LastName & " - " & e.Eval.Comments 
End Sub 

のでoHost.add_EvalReceivedラインは、あなたが暗黙的にデリゲートを作成するためにAddressOf演算子を使用することができますVB6で

+0

であるあなたは.NETオブジェクトに行う必要がある何か他のものはありますか?私はコンパイルしようとすると、 "オブジェクトはオートメーションイベントをソースしません"というメッセージが表示されます –

+0

@ Nitro52わかりません:(実際にはinteropオブジェクトでこれを使用したことはありません。 http://stackoverflow.com/questions/2766656/handling-events-exposed-on-a-net-class-via-com-in-vb6/2772558#2772558)? – MarkJ

1

間違って持っているものの一例ですあなたの宣言にWithEventsを追加してください。oHost

Private WithEvents oHost As HostService.IHost 

これで、IDEでoHostにイベントハンドラを作成できるようになります。これはちょうどあなたのイベントハンドラを作るのと同じです。コードウィンドウの左上にあるドロップダウンでoHostを選択する必要があります。

免責事項:私はこれを何度も使用して、COMオブジェクトからのイベントを処理しました。私は実際にinteropを通して.Netオブジェクトからイベントを処理しようとしたことはありませんでしたが、私はこのようにしなければならないと思います。

4

私はMarkJの助けを借りて作業しています。私はCOMのための私のイベントを表すインターフェイスを持っていなければなりません。そこで、彼らはああ、この

[ComSourceInterfaces(typeof(IHostEvents))] 
[ClassInterface(ClassInterfaceType.None)] 
[Guid("037CF765-4C30-4CF7-969C-1775E79844CE")] 
public class Host : IHost 
{ 
    //IHost implementation 
} 

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
[Guid("8C0C3F0E-5793-4E11-AB20-3A556C0B6790")] 
public interface IHostEvents 
{ 
    [DispId(1)] 
    void EvalReceived(object sender, EvalReceivedEventArgs e); 
} 
関連する問題