2013-04-08 12 views
13

Nella finestra di controllo, che sto cercando di guardare TaskScheduler.Current, ma mi mostra il seguente errore:Come disambiguare tipo nella finestra di controllo quando ci sono due tipi con lo stesso nome

The type 'System.Threading.Tasks.TaskScheduler' exists in both 
'CommonLanguageRuntimeLibrary' and 'System.Threading.dll' 

Questo è vero per il mio programma dal:

  • Questo è un exe NET 4.0 che utilizza la TaskScheduler di mscorlib (CommonLanguageRuntimeLibrary)
  • una DLL viene portato attraverso l'associazione tardiva, che fa riferimento a un vecchio reattiva extensi ons .NET 3.5 System.Threading.dll che ha anche TaskScheduler nello stesso spazio dei nomi.

Domanda: Cosa sintassi posso utilizzare nel debugger per specificare la dll del TaskScheduler voglio esaminare?

Per inciso: presumo che non vi sia alcun problema (cioè non un comportamento indefinito) in termini di avere questi due tipi con identici nomi portati nello stesso eseguibile, giusto?

+4

problema interessante! Non dovrebbe esserci alcuna ambiguità; i riferimenti ai tipi sono tutti qualificati tramite il montaggio. Ma non so se c'è un modo per qualificare i riferimenti nel debugger ... – shambulator

risposta

4

Non sono sicuro se questo funziona attraverso la finestra di controllo (ma non vedo perché non dovrebbe, chissà) - ma il modo di disambiguare tra due dll-s con gli stessi tipi sta usando extern alias.

Questa è la stessa cosa dello global:: - tranne che in questo caso è possibile utilizzare per specificare gli alias dll.

You can use it by setting/defining alias yourself on the dll reference (I think there is alias field there in the properties).

two different DLL with same namespace

non sono sicuro se questo vale esclusivamente per il vostro caso, vale a dire se si è in grado di farlo, ma dovrete di provarlo nel vostro caso.

EDIT: (sulla base dei commenti)

specifiche Dato - ho provato nel mio debugger. Dal momento che l'altro è in ritardo - il compilatore non lo sa (ovviamente, perché non funzionerebbe).

Quindi nel codice sorgente (.cs in cui è necessario eseguire l'orologio in ogni caso) aggiungere in alto, ad es.

using mysystem = global::System.Threading.Tasks.TaskScheduler; 

Poi nell'orologio mysystem.Current (sto basando sul mio esempio)

Oppure ...

using mytasks = global::System.Threading.Tasks; 

e mytasks.TaskScheduler - non importa davvero che uno realmente.

EDIT2:
E per ragioni storiche - I tipi di confermato che il codice di modifica è inevitabile.

1) rimuovere mscorlib dal progetto - progetto, impostazione, creazione, avanzato.

2) scaricare e modificare la configurazione del progetto manualmente - aggiungere il riferimento mscorlib (l'aggiunta tramite VS non è consentita).Inoltre è necessario un altro fix per le applicazioni WPF (fuori portata qui),

3) aggiungere alias per mscorlib - è possibile aggiungerne di più, a parte w/,, che funziona bene,

4) aggiungere extern alias <your alias>,

da quel punto è possibile fare riferimento in debugger - ma non c'è modo di rinunciare al manuale code editing. Anche l'alias esterno è per 'unità di creazione', cioè il file, quindi niente globale.

In breve, questo è il meglio che possiamo fare, IMHO.


E una conferma da @JaredPar su questo
How can I qualify a .NET type with assembly name for Visual Studio debugger to disambiguate while using an ambiguous type?

+0

Non ho nessun alias esterno. Faccio riferimento direttamente a mscorlib. System.Threading.dll arriva attraverso l'associazione tardiva. Con questo in mente, non è chiaro che cosa suggerisco di digitare nella finestra dell'orologio per disambiguare. –

+0

try 'global ::' - è possibile effettuare quanto segue nel codice almeno 'var current = global :: System.Threading.Tasks.TaskScheduler.Current;'. Non ho ancora idea se l'altra dll interferirà con quello. – NSGaga

+0

Ah, capisco. okay, ho provato 'global :: System.Threading.Tasks.TaskScheduler', ma ottengo lo stesso messaggio di errore. Il che ha senso per me perché sono entrambi nello spazio dei nomi globale (dato che non sono stati inseriti tramite un 'alias esterno') –

Problemi correlati