Minderung: Deserialisierung von Objekten über App-Domänen

In Fällen, in denen eine App zwei oder mehr App-Domänen mit unterschiedlichen Anwendungsbasen verwendet, löst der Versuch, Objekte im logischen Aufrufkontext über App-Domänen hinweg zu deserialisieren, eine Ausnahme aus.

Diagnose des Problems

Das Problem tritt bei der folgenden Abfolge von Bedingungen auf:

  1. Eine Anwendung verwendet zwei oder mehr App-Domänen mit unterschiedlichen Anwendungsbasen.

  2. Einige Typen werden explizit zu LogicalCallContext hinzugefügt, indem eine Methode wie LogicalCallContext.SetData oder CallContext.LogicalSetData aufgerufen wird. Diese Typen werden nicht als serialisierbar markiert und werden nicht im globalen Assemblycache gespeichert.

  3. Später versucht Code, der in der nicht standardmäßigen App-Domäne ausgeführt wird, einen Wert aus einer Konfigurationsdatei zu lesen oder XML für die Deserialisierung eines Objekts zu verwenden.

  4. Um aus einer Konfigurationsdatei zu lesen oder das Objekt zu deserialisieren, versucht ein XmlReader-Objekt auf das Konfigurationssystem zuzugreifen.

  5. Wenn das Konfigurationssystem noch nicht initialisiert wurde, muss es seine Initialisierung abschließen. Dies bedeutet unter anderem, dass die Laufzeit wie folgt einen stabilen Pfad für ein Konfigurationssystem erstellen muss:

    1. Sie sucht nach einem Beweis für die nicht standardmäßige App-Domäne.

    2. Sie versucht, den Beweis für die nicht standardmäßige App-Domäne auf Grundlage der Standard-App-Domäne zu berechnen.

    3. Der Aufruf, um einen Beweis für die Standard-App-Domäne zu erhalten, löst einen Aufruf über die App-Domänen hinweg auf, der von der nicht standardmäßigen App-Domäne zur Standard-App-Domäne verläuft.

    4. Im Rahmen des über die App-Domänengrenzen hinweg geltenden Vertrags in .NET Framework muss der Inhalt des logischen Aufrufkontexts auch über App-Domänengrenzen hinweg gemarshallt werden.

  6. Da die Typen im logischen Aufrufkontext nicht in der Standard-App-Domäne aufgelöst werden können, wird eine Ausnahme ausgelöst.

Problemumgehung

Gehen Sie wie folgt vor, um dieses Problem zu umgehen:

  1. Suchen Sie bei Auftreten der Ausnahme nach dem Aufruf von get_Evidence in der Aufrufliste. Bei der Ausnahme kann es sich um verschiedene Ausnahmen handeln, einschließlich FileNotFoundException und SerializationException.

  2. Identifizieren Sie die Position in der App, an der keine Objekte zum logischen Aufrufkontext hinzugefügt werden, und fügen Sie folgenden Code hinzu:

    System.Configuration.ConfigurationManager.GetSection("system.xml/xmlReader");  
    

Siehe auch

Änderungen zur Laufzeit