.NET: Problem mit auslösen und behandeln von Ereignissen mithilfe von AppDomains

Hier ist der Grundtenor meines Problems:

  1. Mein Hauptfenster-Klasse erzeugt ein Objekt der Klasse A.
  2. Klasse A instanziiert die Klasse B in einer sekundäre AppDomain.
  3. Der Klasse B, ein Ereignis auslöst, und der Klasse A behandelt die Veranstaltung erfolgreich.
  4. Klasse A wirft ein Ereignis seine eigenen.

Problem: In Schritt 4, wenn die Klasse Ein, wirft seine eigenen Ereignis aus der Event-handler-Methode, die gefangen-Klasse B-Ereignis, das Ereignis ausgelöst wird; jedoch der abonnieren handler in der Window-Klasse nie aufgerufen wird.

Es gibt auch keine exceptions geworfen. Wenn ich entfernen Sie die sekundäre AppDomain, in der das Ereignis gehandhabt werden soll, ohne ein problem.

Weiß jemand warum das nicht funktioniert? Gibt es einen anderen Weg um diese Arbeit zu machen, ohne einen Rückruf?

Ich würde denken, wenn überhaupt, das problem würde auftreten, in Schritt 3 anstelle von Schritt 4.

Hier ist ein code Beispiel um das problem zu veranschaulichen:

Class Window1

    Private WithEvents _prog As DangerousProgram    

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click    
        _prog = New DangerousProgram()
        _prog.Name = "Bad Program"  
    End Sub

    Private Sub MyEventHandler(ByVal sender As Object, ByVal e As NameChangedEventArgs) Handles _prog.NameChanged
        TextBox1.Text = "Program's name is now: " & e.Name
    End Sub

End Class


<Serializable()> _    
Public Class DangerousProgram

    Private _appDomain As AppDomain
    Private WithEvents _dangerousProgram As Program
    Public Event NameChanged(ByVal sender As Object, ByVal e As NameChangedEventArgs)


    Public Sub New()

        //DangerousPrograms are created inside their own AppDomain for security.

        _appDomain = AppDomain.CreateDomain("AppDomain")    
        Dim assembly As String = System.Reflection.Assembly.GetEntryAssembly().FullName 
        _dangerousProgram = CType( _   
                    _appDomain.CreateInstanceAndUnwrap(assembly, _    
                        GetType(Program).FullName), Program)

    End Sub


    Public Property Name() As String
        Get
            Return _dangerousProgram.Name
        End Get
        Set(ByVal value As String)
            _dangerousProgram.Name = value
        End Set
    End Property


    Public Sub NameChangedHandler(ByVal sender As Object, ByVal e As NameChangedEventArgs) Handles _dangerousProgram.NameChanged    
        Debug.WriteLine(String.Format("Caught event in DangerousProgram. Program name is {0}.", e.Name))
        Debug.WriteLine("Re-raising event...")

        RaiseEvent NameChanged(Me, New NameChangedEventArgs(e.Name))   
    End Sub

End Class


<Serializable()> _    
Public Class Program
    Inherits MarshalByRefObject

    Private _name As String
    Public Event NameChanged(ByVal sender As Object, ByVal e As NameChangedEventArgs)

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
            RaiseEvent NameChanged(Me, New NameChangedEventArgs(_name))
        End Set
    End Property   

End Class


<Serializable()> _   
Public Class NameChangedEventArgs
    Inherits EventArgs

    Public Name As String

    Public Sub New(ByVal newName As String)
        Name = newName
    End Sub

End Class
InformationsquelleAutor Rob Sobers | 2009-08-14
Schreibe einen Kommentar