Debuggen von MEF

Aufgrund der Unterschiede zu einer normalen App kann das Debuggen von Problemen im Managed Extensibility Framework (MEF) mit Schwierigkeiten verbunden sein. In diesem Thema werden einige Tipps zur Diagnose von spezifischen MEF-Problemen gegeben, und es wird auf einige mögliche Ursachen hingewiesen.

Erkennen von MEF-Problemen

Der erste Schritt beim Lösen eines MEF-Problems, besteht darin, das Problem auf die MEF-Komponente der App zurückzuführen. In der folgenden Tabelle sind die spezifischen MEF-Probleme aufgelistet.

Problem

Mögliche Ursachen:

Während der Komposition wird eine ImportCardinalityMismatchException-Ausnahme ausgelöst.

Ein Import konnte nicht mit einem entsprechenden Export ausgefüllt werden, da ein Teil fehlt oder zurückgewiesen wurde.

- oder -

Für einen Import, der einen einzelnen Export erwartete, wurden mehrere Übereinstimmungen gefunden.

In einer Auflistung mit dem ImportManyAttribute-Attribut fehlen die erwarteten Inhalte.

Erwartete Teile fehlen oder wurden abgelehnt.

Ein Import, für dessen DefaultValueAttribute-Attribut true festgelegt ist, wird unerwartet nicht ausgefüllt.

Eine erwartete Übereinstimmung fehlt oder wurde abgelehnt.

Fehlerbehandlung und DisableSilentRejection

MEF ist so konzipiert, dass es sich robust an verschiedene Konfigurationen anpasst. Standardmäßig ignoriert es Teile, die bei denen erforderliche Abhängigkeiten fehlen. Beim Debuggen der App kann es aufgrund dieser Stabilität jedoch schwieriger sein, die Ursache eines Problems herauszufinden. Diese Schritte machen es einfacher, Probleme zu ermitteln:

  • Konfigurieren Sie den Visual Studio-Debugger so, dass eine Unterbrechung erfolgt, wenn Ausnahmen ausgelöst werden.

  • Konfigurieren Sie das CompositionContainer-Objekt so, dass die Rückweisung deaktiviert ist.

Im Allgemeinen unterbricht der Visual Studio-Debugger im Fall einer Ausnahme die Ausführung nur dann, wenn diese Ausnahme anschließend nicht behandelt wird. Allerdings kann es hilfreich sein, die MEF-App sofort zu beenden und zu debuggen, wenn eine Ausnahme ausgelöst wird, da die App Ausnahmen möglicherweise auf eine bestimmte Weise behandelt und nicht für den Debugger verfügbar macht. Wählen Sie zunächst Debuggen und dann Ausnahmen, um den Visual Studio-Debugger so zu konfigurieren, dass beim Auslösen von Ausnahmen die Ausführung unterbrochen wird. Stellen Sie sicher, dass für alle Ausnahmen, bei denen der Debugger die Ausführung unterbrechen soll, das Feld Ausgelöst aktiviert ist. (Für MEF sind dies die Ausnahmen unter System.ComponentModel.Composition. Weitere Informationen finden Sie unter Gewusst wie: Unterbrechen bei ausgelöster Ausnahme.) Diese Ausnahmen werden nun im Debugger angezeigt, selbst wenn die App sie behandelt.

Standardmäßig verwendet MEF ein Verfahren, das Rückweisung genannt wird, um zu bestimmen, welche Teile über alle Abhängigkeiten verfügen, die für die Instanziierung erforderlich sind. Das Kompositionsmodul überprüft, ob das Hinzufügen der neuen Teile einen Fehler bei der Komposition verursacht. Wenn sie Fehler verursachen könnten, werden diese Teile für den Container ausgeblendet, aber es wird keine Ausnahme ausgelöst. Aufgrund dieses Verhaltens verhält sich die App bei verschiedenen Bereitstellungskonfigurationen zwar stabiler, das Debuggen wird jedoch möglicherweise schwieriger. Wenn Sie die Rückweisung deaktivieren und sicherstellen möchten, dass MEF eine Ausnahme auslöst, wenn ein Teil zurückgewiesen wird, übergeben Sie den DisableSilentRejection-Wert an das CompositionContainer-Objekt oder das ExportProvider-Objekt. Der folgende Code zeigt dies:

var catalog = new DirectoryCatalog("Extensions");
var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);

Bestimmen der zugrunde liegende Ursachen

MEF-Fehler sind häufig überlappende Fehler. Dies bedeutet, dass ein Fehler beim Zusammensetzen eines Teils einen Fehler beim Zusammensetzen eines zweiten Teils verursacht usw., bis die Fehlerquelle in einer langen Liste von Ausnahmen verloren geht. Damit Probleme dieser Art leichter diagnostiziert werden können, stellt die CompositionException-Ausnahme die RootCauses-Eigenschaft bereit. Sie können diese Eigenschaft im Debugger überprüfen, um die Ausnahme zu finden, die die zugrunde liegende Ursache der einzelnen Fehler in der Komposition ist.

Ablaufverfolgung

Ab .NET Framework 4,5 unterstützt MEF die Ablaufverfolgung. Kompositionsfehler und -Ausnahmen werden bei der Ausführung im Debugmodus in Visual Studio in das Fenster IntelliTrace geschrieben. Diese Ergebnisse können Ihnen dabei helfen, Kompositionsfehler zu diagnostizieren. Weitere Informationen zu IntelliTrace finden Sie unter Debuggen einer App durch Aufzeichnen der Codeausführung mit IntelliTrace.

Untersuchen verfügbarer Teile

Um zu bestimmen, welche Teile für den Katalog verfügbar sind, können Sie entweder die Parts-Eigenschaft des Katalogs im Debugger überprüfen oder diese Eigenschaft im Code durchlaufen.

Erwartete Teile, die nicht vorhanden sind, wurden abgelehnt oder nicht gefunden.

Wenn ein Teil angezeigt wird, das jedoch nicht dem erwarteten Import entspricht, ist ein Konflikt aufgetreten. Weitere Informationen finden Sie im nächsten Abschnitt.

Fehlende Übereinstimmungen beim Exportieren/Importieren

Ein Export stimmt mit einem bestimmten Import überein, wenn die folgenden Bedingungen erfüllt sind. Überprüfen Sie diese Bedingungen genau, wenn eine erwartete Übereinstimmung nicht eintritt, Sie jedoch sicher sind, dass der Export im Katalog vorhanden ist. Diese Bedingungen gelten auch beim manuellen Erstellen eines Vertrags für die Übereinstimmung mit einem bestimmten Export. Weitere Informationen finden Sie unter der ExportProvider.GetExports-Methode.

Eigenschaft

Bedingungen für eine Übereinstimmung

Name des Vertrags

Bei diesem Wert muss eine genaue Übereinstimmung unter Berücksichtigung der Groß-/Kleinschreibung vorliegen. Bei Vertragsnamen, die von Typen abgeleitet werden (z. B., wenn das ExportAttribute-Attribut ohne Parameter verwendet wird), ist ein anderer Name, der vom gleichen Typ abgeleitet wurde, die einzige mögliche Entsprechung.

Vertragstyp

Dieser Wert muss eine exakte Übereinstimmung darstellen. Polymorphe Übereinstimmungen werden nicht unterstützt. Vertragstypen müssen auch dann übereinstimmen, wenn entsprechende Vertragsnamen angegeben werden.

Erforderliche Metadaten

Alle Metadaten, die der Import von den Eigenschaften der Metadatenansicht benötigt, müssen vom Export über ein ExportMetadataAttribute-Attribut oder ein benutzerdefiniertes Metadatenattribut bereitgestellt werden. Sowohl die Metadatenschlüssel (die Namen der Eigenschaften in der Metadatenansicht) als auch die Typen der Metadatenwerte müssen übereinstimmen.

Erstellungsrichtlinie

Beim Export muss die gleiche Erstellungsrichtlinie wie beim Import verwendet werden. Weitere Informationen finden Sie unter der CreationPolicy-Enumeration.

Erkennungsprobleme

Ein Teil im Katalog wird nicht angezeigt oder dieses Teil wird bei Verwendung des Kompositionsanalysetools MEFX vom Katalog nicht erkannt. Dies sind einige mögliche Ursachen für diesen Fehler:

  • Das Teil ist ein abstrakter Typ. Abstrakte Typen können nicht als Teile verwendet werden. Legen Sie den Typ als nicht abstrakt fest, oder erstellen Sie einen nicht abstrakten Untertyp.

  • Das ImportingConstructorAttribute-Attribut fehlt. Ein Teil, das über mehrere Konstruktoren oder ausschließlich über Konstruktoren verfügt, die Parameter akzeptieren, muss einen Konstruktor angeben, den MEF mit dem ImportingConstructorAttribute-Attribut verwenden soll.

  • Das Teil weist das PartNotDiscoverableAttribute-Attribut auf. Dieses Attribut verhindert, dass ein Teil erkannt wird.

  • Das Teil ist ein offener generischer Typ. MEF unterstützt keine offenen generischen Typen. Verwenden Sie eine geschlossene Unterklasse des Typs, oder exportieren Sie einzelne Eigenschaften.

Zusätzliche Fehler können auftreten, wenn Sie ein DirectoryCatalog-Objekt verwenden:

  • Das Teil befindet sich in einer EXE-Datei. Der DirectoryCatalog-Standardkatalog liest nur aus DLL-Dateien. Mit einem DirectoryCatalog-Objekt können Sie aus anderen Dateien lesen, indem Sie beim Erstellen ein entsprechendes Suchmuster verwenden.

  • In der Assembly des Teils fehlt ein Verweis. Die von Ihnen verwendeten Assemblys müssen die Verweise aus dem Suchpfad laden können, d. h. aus dem eigenen Verzeichnis oder aus dem globalen Assemblycache.

  • Die Assembly des Teils weist einen anderen CPU-Typ auf. Assemblys für den falschen CPU-Typ werden von MEF nicht geladen.

Siehe auch

Konzepte

Managed Extensibility Framework (MEF)