15

Ho appena aggiornato Visual Studio 11 Beta al nuovo Visual Studio 2012 RC e ho problemi con riferimento a TPL Dataflow.Problemi con riferimenti a TPL Dataflow e TPL in VS 2012 RC

In primo luogo, ho provato a fare riferimento a Dataflow come ho fatto in precedenza, aggiungendo un riferimento dal framework. Ma quando provo a farlo, ottengo una finestra di errore:

A reference to 'System.Threading.Tasks.Dataflow' could not be added.

e quindi l'intero Visual Studio si blocca.

Dopo aver letto MEF and TPL Dataflow NuGet Packages for .NET Framework 4.5 RC, ho assunto che la versione di Dataflow mostrata nell'elenco dei riferimenti fosse una sorta di artefatto dell'installazione precedente. Così, ho provato ad utilizzare Dataflow da NuGet, che sembrava funzionare, fino a quando in realtà ho provato a compilare il mio codice, perché ho ottenuto un errore:

The type 'System.Threading.Tasks.Task' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

Questo è fonte di confusione, perché Task è in mscorlib, altri riferimenti dovrebbe essere necessario Ma c'è un assembly di riferimento chiamato System.Threading.Tasks nell'elenco dei riferimenti, quindi ho provato ad aggiungerlo. Sfortunatamente, un familiare errore mostrava:

A reference to 'System.Threading.Tasks' could not be added.

e quindi Visual Studio si bloccava di nuovo.

Sto facendo qualcosa di sbagliato? Come posso utilizzare TPL Dataflow con VS 2012 RC?

+0

È un nuovo progetto o uno esistente? –

+0

Il problema si verifica quando si crea un nuovo progetto. L'apertura di un progetto creato con VS11 Beta che già utilizza TPL Dataflow funziona correttamente. – svick

+0

[Ho postato questo bug su Connect.] (Https://connect.microsoft.com/VisualStudio/feedback/details/746558/problems-with-references-to-tpl-dataflow-and-tpl) – svick

risposta

23

Provare a "Aggiungi riferimento" il esplicitamente da C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5. In alternativa è possibile utilizzare la directory C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades.

AGGIORNAMENTO: Ho esaminato il problema più dopo la lettura di the answer sulla rimozione del riferimento System.Runtime e posso aggiungere quanto segue: Il riferimento alla System.Runtime verrà aggiunto a causa dell'errore nella versione currect del pacchetto NuGet Microsoft.Tpl.Dataflow.4.5.1-rc. Se si aggiunge il riferimento allo stesso System.Threading.Tasks.Dataflow.dll direttamente in Visual Studio, verrà aggiunto il riferimento System.Runtime e nessun problema esiste.

Utilizzando NuGet Package Explorer è possibile scaricare l'originale Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg dalla "fonte di pacchetto ufficiale NuGet". Alla fine del Matadata pacchetto si vedrà

enter image description here

Si può modificare i metadati (stampa Ctrl-K) e rimuovere il riferimento:

enter image description here

Dopo di che si può salva il file modificato Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg in qualche directory. Dopo aver aggiunto una nuova posizione (la directory locale) nell'elenco dei sorgenti NuGet (vedi here o here) si sarà in grado di aggiungere un nuovo pacchetto dalla sorgente locale (non dimenticare di scegliere di visualizzare tutti i pacchetti compresa la pre-release vedere la foto qui sotto):

enter image description here

il modificata Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg non aggiungerà System.Runtime e il progetto verrà compilato senza errori.

Così il bug non esiste in Visual Studio 2012 RC e anche se non in Microsoft.Tpl.Dataflow.dll. Il bug si trova solo nei metadati della versione pre-release del pacchetto NuGet Microsoft.Tpl.Dataflow disponibile attualmente su "Origine pacchetto ufficiale NuGet".

È possibile inviare la segnalazione di bug al autors in modo che il pacchetto venga corretto.

AGGIORNATO 2: Anche se la mia risposta è già stata contrassegnata come risolta e la taglia che ha assegnato il problema non mi è ancora passata per la testa. In realtà io vedo due problemi aperti:

  1. Perché l'esistenza di assemblaggio inutilizzata System.Runtime può produrre l'errore durante la builging del progetto.
  2. Vedo alcuni problemi generali nel modo in cui funziona la disinstallazione o l'aggiornamento dei pacchetti NuGet (vedere i dettagli più avanti).

Accettiamo solo il fatto che il primo problema esiste indipendentemente dalla ragione. Il secondo problema mi rende irrequieto. Vedo il vero problema qui. Ognuno può fare il seguente esperimento per capire meglio di me:

  1. Creare una nuova applicazione console vuota in Visual Studio 2012 RC.
  2. Verificare che il progetto non abbia riferimento a System.Runtime.
  3. Aprire "Console Gestione pacchetti" da "Strumenti"/"Gestore pacchetti libreria".
  4. eseguire il comando "Installare-Pacchetto Microsoft.Tpl.Dataflow -Pre" nella "Console Package Manager".
  5. Verificare che sia System.Runtime sia System.Threading.Tasks.Dataflow siano inclusi nell'elenco dei riferimenti del progetto.
  6. eseguire il comando "Uninstall -Package Microsoft.Tpl.Dataflow" nel "Gestore Console Package".
  7. Verificare che System.Threading.Tasks.Dataflow vengano rimossi dall'elenco di Riferimenti del progetto, ma System.Runtime è ancora nell'elenco di riferimenti.

ho fatto un altro esperimento e ho cambiato la versione di modificata Microsoft.Tpl.Dataflow.4.5.1-rc.nupkg, dove ho rimosso il riferimento a System.Runtime, da 4.5.1-rc a 4.5.1-rc1 e salvato in locale (verrà salvato con Microsoft.Tpl.Dataflow.4.5.1-rc1.nupkg). Dopo che ho potuto vedere la versione "nuova" nella lista degli aggiornamenti al mio progetto:

enter image description here

Se installare l'aggiornamento il riferimento a System.Runtime sarà, inoltre, non rimosso.

Quindi l'implementazione corrente di "Aggiornamento" e "Disinstalla" di NuGet presenta il bug o un problema di progettazione generale. Se aggiungiamo un pacchetto al nostro progetto e facciamo alcuni aggiornamenti del progetto, otterremo i riferimenti di tutti gli assembly dipendenti di tutte le vecchie versioni. I vecchi riferimenti, aggiunti da NuGet dalle vecchie versioni del pacchetto, non verranno rimossi durante la disinstallazione o l'aggiornamento.Prima di tutto non è bello avere spazzatura nei riferimenti del progetto, ma a causa dell'esistenza del primo problema (errore durante la compilazione se esiste il riferimento a System.Runtime senza riferimento) il problema sarà ancora più serio.

Quindi, se non verrà modificato nulla in NuGet, l'aggiornamento alla versione successiva di Microsoft.Tpl.Dataflow non risolverà il problema per gli utenti che hanno installato Microsoft.Tpl.Dataflow nella versione 4.5.1 (o probabilmente nella versione precedente). Tutti gli utenti dovranno rimuovere manualmente il riferimento a System.Runtime. Penso che sia un vero problema NuGet che deve essere risolto dagli sviluppatori NuGet. In seguito pubblicherò la descrizione del problema in http://nuget.org/.

Il bug report che ho inviato a NuGet può essere trovato here (mi dispiace per la formattazione non perfetta del testo).

+0

Grazie, sembra funzionare (ho usato il secondo). Qualche idea del perché accada questo? – svick

+0

@svick: non ho esaminato il problema nei dettagli. Senza il riferimento, la nuova versione di 'System.Threading.Tasks.Dataflow' ha provato a utilizzare la versione errata di' System.Threading.Tasks.dll'. Non ho usato TPL Dataflow prima. Ho appena copiato il codice demo da [la pagina] (http://msdn.microsoft.com/en-us/library/hh194684 (v = vs.110) .aspx) e ho ricevuto l'errore che hai descritto e l'errore in la riga 'workerBlock.Completion.Wait();': Il metodo Wait non esiste. Era chiaro che Microsoft ha cambiato alcune classi e ho usato assembly errato. Quindi bisognava solo trovare quello corretto. – Oleg

+0

@svick: Tra l'altro ho trovato alla fine del [blog] (http://blogs.microsoft.co.il/blogs/oshvartz/) la mancia per aggiungere lo stesso riferimento che ho descritto nella mia risposta. Quindi sembra che tu non sia la prima persona che ha il problema. – Oleg

2

According to Alok Shriram from MS, the solution is to remove the reference to System.Runtime e che verrà risolto nella prossima versione.

Posso confermare che la rimozione del riferimento risolve effettivamente il problema.

+0

La rimozione del riferimento a 'System.Runtime.dll' dal progetto è migliore per aggiungere un nuovo riferimento' System.Threading.Tasks.dll'. Dall'altro lato non è chiaro * perché * il conflitto esiste. Ho esaminato il Manifest di 'System.Runtime.dll' in relazione a" IL Disassembler "(ildasm.exe) e non ho visto alcun conflitto. Quindi per me entrambe le cose sono come: "Fai questo e il problema sarà risolto". Quindi posso ripetere la stessa domanda che mi hai rivolto prima: "Qualche idea sul perché questo accada?" – Oleg

+0

Sì, mi piacerebbe saperlo anche io. SR non contiene alcun AssemblyRef to STT, quindi non ho idea del perché rimuoverlo. – svick

+0

Inoltre, il riferimento a 'System.Runtime' è stato aggiunto ** dall'esecuzione di' Install-Package Microsoft.Tpl.Dataflow -Pre' **, ma il file 'system.threading.tasks.dataflow.xml' don ' t contenere qualsiasi testo 'System.Runtime'. Se avessimo problemi di caricamento di assembly potremmo usare [Fuslogvw.exe] (http://msdn.microsoft.com/en-us/library/e74a18c4 (v = vs.110) .aspx) per tracciare, ma abbiamo * errore del compilatore *. Tra l'altro ho usato [ReSharper] (http://confluence.jetbrains.net/display/ReSharper/ReSharper+7+EAP) che aiuta a rimuovere riferimenti inutilizzati, ma non rimuove 'System.Runtime' come altri riferimenti . – Oleg

Problemi correlati