Open Generische Typen werden nicht im Katalog registriert

8

Wir verwenden .NET 4.5 und hatten bis vor einem Monat kein Problem mit offenen generischen Exporten in MEF, als es plötzlich nicht mehr funktionierte. 70 Tests auf unserem CI-Server wurden rot und wir führten sie auf fehlende Teile im Container zurück.

Ich fand es seltsam, also schrieb ich diesen Testcode:

%Vor%

Es sieht jedoch so aus, als würde keiner der offenen generischen Typen im Katalog registriert werden. Parts ist ein TypeCatalog mit Types = <Empty> .

Normalerweise gehen wir durch deklarative Exporte über Attribute wie in diese SO-Frage , aber Keine der Alternativen scheint mehr zu funktionieren.

Jede Idee wird sehr geschätzt.

    
Mikael Lundin 09.08.2013, 13:07
quelle

5 Antworten

2

Irgendeine Idee, was es ausgelöst hat, zu versagen? Haben Sie in diesem Zeitraum ein .NET-Update erhalten?

Aus Neugierde, wenn Sie eine einfache Konsolen-App Targeting .NET.

Der Grund warum ich frage ist, glaube ich, dass ein Update für .NET 4.5 veröffentlicht wurde, um sicherzustellen, dass Open Generics bestehende .NET 4.0 Apps nicht kaputt machen und wenn Ihre Tests aus irgendeinem Grund im .NET 4.0 Modus laufen Die offene generische Unterstützung wird deaktiviert, was dazu führen könnte, was Sie sehen.

    
Wes Haggard 21.08.2013 04:29
quelle
2

Ich habe das in meiner Web-App gelöst, indem ich den Eintrag & lt; httpRuntime targetFramework="4.5" / & gt; in meiner web.config. Stellen Sie für nicht webbasierte Apps sicher, dass die Datei app.config den Eintrag enthält         & lt; unterstützteRuntime version="v4.0" sku=". NETFramework, Version = v4.5" / & gt;.

Weitere Informationen finden Sie Ссылка .

    
Hasani Blackwell 01.03.2014 12:24
quelle
1

Ich weiß, dass dies ein altes Problem ist, aber ich habe einige zusätzliche Informationen, die anderen helfen können.

Ich stieß auf das gleiche Problem. Meine Komponententests arbeiteten dann plötzlich gestoppt. Wir haben es auf zwei Windows-Updates beschränkt: KB2840642v2 und KB2840642. Nach der Deinstallation von MEF hat MEF in Komponententests wieder ordnungsgemäß funktioniert. Ich habe in den Versionshinweisen nichts zu den Updates gesehen, die die Dinge beeinflussen sollten, aber Sie wissen, wie das geht.

Leider laufe ich jetzt Windows 8 und das Problem ist wieder aufgetaucht. Ich habe diese Updates nicht installiert. Ich denke, sie wurden nativ in das Betriebssystem integriert.

    
terryagi 11.02.2014 20:46
quelle
1

Wenn Sie "auf unserem CI-Server" sagen, sagt uns das nicht viel darüber aus, wie Sie die Tests durchführen. Wie auch immer, ich scheine mit vstest.console.exe eine Erfahrung wie die deine zu bekommen.

Ich habe eine Situation gefunden, in der die automatische Schließfunktion von MEF, neu in .net-4.5, beim Ausführen von Tests mit vstest.console.exe zu brechen scheint. Grundsätzlich könnte vstest.console.exe sich dafür entscheiden, im .net-4.0-Kompatibilitätsmodus ausgeführt zu werden, als wäre /Framework:Framework40 an ihn übergeben worden. .net-4.5-Assemblys werden auch dann geladen und ausgeführt, wenn sie von einer .net-4.0-Laufzeit geladen werden, aber MEF erkennt, dass Sie im .net-4.0-Modus ausgeführt werden, und deaktiviert die Unterstützung für das automatische Schließen generischer Typen. Sie können MEF dazu bringen, sich wieder ordnungsgemäß zu verhalten, indem Sie vstest.console.exe im .NET-4.5-Modus ausführen, indem Sie den Schalter /Framework:Framework45 übergeben.

(Dies wurde auf einer Maschine getestet, auf der .net-4.6.1 installiert ist, aber ich bin mir nicht sicher, ob sich das noch ändert).

Minimal Repro

Wenn ich eine einfache Testassembly für das .net-4.5-Framework mache, erwartet vstest.console.exe korrekt, dass es die Tests mit .net-4.5 ausführen soll. Wenn ich jedoch eine Assembly zusammenstelle, die in eine komplexere Build-Umgebung integriert wird, beginnt vstest.console.exe plötzlich im .net-4.0-Modus statt im .net-4.5-Modus. Also habe ich mit meiner komplexen Build-Umgebung angefangen und angefangen, Dinge zu packen, bis das Problem verschwunden ist.

Um vstest.console.exe dazu zu bringen, das falsche Framework zu erraten, benötigen Sie zwei Assemblys. Definieren Sie in einem Fall eine benutzerdefinierte Assembly Attribute . In einem anderen Fall wenden Sie dieses benutzerdefinierte Assembly-Attribut an und definieren Sie Ihre Komponententests.

Erste Montage:

%Vor%

Zweite Baugruppe, die auf die vorherige verweist:

%Vor%

Mit diesen beiden Assemblies und dem definierten Test erhalte ich in verschiedenen Szenarien folgende Ergebnisse:

  1. Das Ausführen der Tests mit der Benutzeroberfläche der Visual Studio 2015 Community Edition funktioniert einwandfrei.

  2. Das Ausführen des Codes direkt als ausführbare Datei funktioniert einwandfrei.

    %Vor%
  3. Führen Sie die Tests mit etwas wie mstest ( aus, außer dass ich nicht sagen kann, warum man das statt verwenden würde oder nicht) vstest () funktioniert magisch (zumindest in diesem Fall) (Ausgabe getrimmt).

    %Vor%
  4. Das Ausführen mit "Straight Up" vstest.console.exe schlägt fehl (Ausgabe getrimmt):

    %Vor%
  5. Aber vstest.console.exe /Framework:Framework45 gelingt:

    %Vor%
binki 19.03.2016 21:58
quelle
0

Ich denke, Sie können nicht offene generische verwenden und sollte eine konkrete laufende Klasse wie bereitstellen:

%Vor%

Ich habe versucht, Schnittstellen wie IIpersonator und ICache und funktioniert auch nicht:

%Vor%     
JoseH 20.09.2013 08:34
quelle

Tags und Links