2009-05-12 32 views
3

VB.NETコンポーネントから生成されたイベントを処理するクラスをインスタンス化するVB6コードがあります。 VB6は非常に簡単です:イベントハンドラオブジェクトは、(それがコレクションに格納されている理由である)initメソッドの範囲を超えて生きることを持っていることをVB.NETコードでのVB.NETイベントの処理

private m_eventHandler as new Collection 

... 

public sub InitSomething() 
    dim handler as EventHandler 

    set handler = new EventHandler 
    m_eventHandler.Add handler 
    ... 
    m_engine.Start 

end sub 

注意。 m_engine.Startは、VB.NETコンポーネントがイベントを発生させ始めるプログラム内のポイントを示します。 (要求されたように)

実際のイベントハンドラ:

Private WithEvents m_SomeClass As SomeClass 
Private m_object as Object 
... 

Private Sub m_SomeClass_SomeEvent(obj As Variant) 
    Set obj = m_object 
End Sub 

EventHandlerのインスタンスが作成されるときm_objectが初期化されます。

イベントを発生させるVB.NETのコードはさらに簡単です:

Public ReadOnly Property SomeProp() As Object 
    Get 
     Dim obj As Object 
     obj = Nothing 
     RaiseEvent SomeEvent(obj) 
     SomeProp = obj 
    End Get 
End Property 

私の問題は私デバッグ VB6プログラム、初めてInitSomethingが呼び出されたときに、イベントはないということです(VB6イベントハンドラは決して入力されません)。その後のInitSomethingの呼び出しは機能しません。

デバッガの外でプログラムを実行すると、予想どおりに機能します。この時点で、私はこれが私が心配すべき何かであるかどうかも分かりません。

関連性があるかもしれませんが、VB.NETはVisual Studioコード変換ツールを使用してVB6から変換されました(その後、手動でクリーンアップされました)。

+0

実際のイベントハンドラとハンドリングオブジェクトの宣言を表示できますか? ( "WithEvents"を持つもの)? –

答えて

0

しようとするだけで何か - 私は本来の不信感持って「新規として..」を

あなたは

private m_eventHandler as Collection 

public sub InitSomething() 
    dim handler as EventHandler 

    set handler = new EventHandler 

    If m_eventHandler Is Nothing Then 
    Set m_eventHandler = New Collection 
    End if 

    m_eventHandler.Add handler 
... 

    m_engine.Start 

end sub 

ああを試すことができ、私は、これは通常の実行で動作し、なぜ何のアイデアを得なかったし、デバッグではなく、.NETでVBA.Collectionオブジェクトをインスタンス化できないという漠然な疑いを除いて、.NETコードでコレクションを作成していないため、VB6コンポーネントを作成することをお勧めします。それはまだまだ曖昧な疑惑です。

5

私は、VB6(または他のCOM環境)での消費のための.Netコンポーネントを作成している場合、インターフェイスの利用は絶対に批判的であることがわかりました。

イベントを有効にしようとしているときに、特にVStudioを使用してすぐに表示されるCOMテンプレートは望ましいものです。

ここに私が使ったことがあります。

Imports System.Runtime.InteropServices 
Imports System.ComponentModel 

<InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(ClientAction.InterfaceId)> Public Interface IClientAction 
     <DispId(1), Description("Make the system raise the event")> sub SendMessage(ByVal theMessage As String) 
    End Interface 


    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid(ClientAction.EventsId)> Public Interface IClientActionEvents 
     <DispId(1)> Sub TestEvent(ByVal sender As Object, ByVal e As PacketArrivedEventArgs) 
    End Interface 



    <ComSourceInterfaces(GetType(IClientActionEvents)), Guid(ClientAction.ClassId), ClassInterface(ClassInterfaceType.None)> _ 
    Public Class ClientAction 
     Implements IClientAction 

     Public Delegate Sub TestEventDelegate(ByVal sender As Object, ByVal e As PacketArrivedEventArgs) 

     Public Event TestEvent As TestEventDelegate 

    public sub New() 
     //Init etc 
    end sub 

    public sub SendMessage(theMessage as string) implements IClientAction.SendMessage 
     onSendMessage(theMessage) 
    end sub 

     Protected Sub onSendMessage(message as string) 
      If mRaiseEvents Then 
       RaiseEvent TestEvent(Me, New PacketArrivedEventArgs(theMessage)) 
      End If 
     End Sub 

    end Class 

私はイベントでは正常に動作し、部品の内外にデバッグできるようにアセンブリ/コンポーネントのCOMと.NETの消費者を得ることができました。

これが役に立ちます。

関連する問題