Possiedo Visual Studio 2015 Enterprise e ho scoperto che non riesco a compilare quasi nessuno dei nostri progetti 2013 esistenti. Ulteriori indagini rivelano che Visual Studio 2015 non è in grado di generare falsi per i tipi che sono stati bene in Visual Studio 2013.Fake Broken in Visual Studio 2015
considerare i seguenti passaggi per riprodurre:
- Creare un progetto di test di unità mira .NET 4.5
- tasto destro del mouse su "sistema" nella scheda riferimenti e scegliere "Aggiungi Assemblea Fakes"
- per eliminare il rumore per questo esempio, modificare il successivo file "System.fakes":
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
<Assembly Name="System" Version="4.0.0.0"/>
<StubGeneration>
<Clear/>
</StubGeneration>
<ShimGeneration>
<Clear/>
</ShimGeneration>
</Fakes>
- Quindi modificare il file "mscorlib.fakes" per spessorare ConcurrentDictionary < TKey, TValue>:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
<Assembly Name="mscorlib" Version="4.0.0.0"/>
<StubGeneration>
<Clear/>
</StubGeneration>
<ShimGeneration>
<Clear/>
<Add FullName="ConcurrentDictionary"/>
</ShimGeneration>
</Fakes>
compilare il progetto.
Questo genera i seguenti messaggi di errore nel file di mscorlib.4.0.0.0.Fakes.messages (generato nella cartella FakesAssemblies):
avvertimento: la compilazione è fallita, riprovare senza Codice Contratti
E seguenti messaggi di errore nella finestra di output:
c: \ temp \ UnitTestProject1 \ UnitTestProject1 \ f.cs (955,13): errore CS0311: il tipo 'System.Collections.Concurrent.ConcurrentDictionary' non può essere utilizzato come parametro di tipo 'TShimmed' nel tipo generico o nel metodo 'ShimRuntime .Bind (TShim, TBound) '. Non esiste alcuna conversione implicita del riferimento da "System.Collections.Concurrent.ConcurrentDictionary" a "System.Collections.Generic.IReadOnlyCollection>". [c: \ temp \ UnitTestProject1 \ UnitTestProject1 \ obj \ Debug \ Fakes \ m \ f.csproj]
c: \ temp \ UnitTestProject1 \ UnitTestProject1 \ f.cs (979,13): errore CS0311: il tipo ' System.Collections.Concurrent.ConcurrentDictionary 'non può essere utilizzato come parametro di tipo' TShimmed 'nel tipo generico o nel metodo' ShimRuntime.Bind (TShim, TBound) '. Non esiste alcuna conversione implicita del riferimento da "System.Collections.Concurrent.ConcurrentDictionary" a "System.Collections.Generic.IReadOnlyDictionary". [C: \ temp \ UnitTestProject1 \ UnitTestProject1 \ obj \ Debug \ Falsi \ m \ f.csproj]
GENERATEFAKES: errore: la compilazione del progetto non riuscita con codice di uscita 1
Nessuna quantità di giocherellare con mscorlib. le impostazioni dei falsi sembrano aiutare. Ad esempio, varie permutazioni degli attributi TypeName, FullName e Namespace producono la stessa "compilazione non riuscita con codice di uscita 1".
Disattivazione contratti codice appena rompe più:
Attenzione L'elemento 'falsi' nello spazio dei nomi 'http://schemas.microsoft.com/fakes/2011/' ha valida elemento figlio 'StubGeneration' nello spazio dei nomi 'http://schemas.microsoft.com/fakes/2011/'. UnitTestProject1 c: \ temp \ UnitTestProject1 \ UnitTestProject1 \ Falsi \ mscorlib.fakes 4
Qualsiasi aiuto capire come risolvere il problema/ovviare a questo problema sarebbe molto apprezzato.
aggiornamento rapido su questo - abbiamo scoperto che questo errore solo appare quando si rivolge a qualsiasi framework .NET diverso da 4.6. Avevamo evitato .NET 4.6 a causa di [questo problema] (http://blogs.msdn.com/b/dotnet/archive/2015/07/28/ryujit-bug-advisory-in-the-net-framework- 4-6.aspx). – 42vogons
Sembra che al momento funzioni solo per bloccare il ConcurrentDictionary. Questo ha risolto i miei problemi ma molto probabilmente non risolverà il tuo:/ –
E lì ho digitato troppo velocemente. Posso cancellare il dizionario concorrente, ma non posso ancora aspettarmi nulla dai suoi metodi ... –