2015-11-04 30 views
5

La mia applicazione .NET può caricare più versioni dello stesso assieme in memoria. Gli assembly non sono firmati ma ogni volta che una nuova copia dell'assembly viene rispettata e caricata automaticamente ottiene una nuova versione di assembly (in piccola parte). Non ho alcun problema con i tipi poiché gli oggetti di istanziazione sono sotto controllo, quindi so da quale assembly viene creato l'oggetto.Visual Studio 2015 non riesce a valutare le variabili quando vengono caricate due versioni di assembly

Questo funzionava sin dal VS 2003, ma con l'ultimo VS 2015 il debug di questo scenario è rotto. Tutto funziona bene mentre solo una singola versione di assembly viene caricata in memoria, ma ogni volta che viene caricata la seconda versione tutte le finestre di Local/Watch diventano vuote. E provare a valutare qualsiasi espressione in QuickWatch fornisce un'eccezione del compilatore "errore CS1704: un assembly con lo stesso nome semplice" MyAssembly "è già stato importato. Provare a rimuovere uno dei riferimenti (ad esempio" MyAssembly.dll ") o firmarlo a abilitare side-by-side. "

Ecco schermate della stessa applicazione con debugger collegate dalle VS2013 e VS2015 (quando vengono caricati due assiemi):

VS2013 Debugger: VS2013 Debugger

VS2015 Debugger: VS2015 Debugger

E le parti selezionate dall'elenco di assiemi caricati: Two different versions of an assembly

Quindi questo rende il debugging con VS 2015 quasi impossibile.

Poiché originariamente si tratta di un errore di compl. (Che a mio avviso è utilizzato sotto la copertura del debugger di VS 2015), la ricerca su Internet non è molto utile. Ecco l'unico collegamento relativo al problema di Debugger che sono stato in grado di trovare: Visual Studio Debugger Failing to inspect variables. La differenza nel mio caso è che avere due assembly in memoria è stato un errore mentre nel mio caso questo è un intento.

Quindi ora sto pensando alle mie opzioni.

  • Naturalmente, mi piacerebbe avere qualche patch per VS 2015 che risolverà il problema. Ma essendo realistico non sono sicuro che ciò accadrà.
  • La firma degli assembly (come suggerisce il compilatore) non è un'opzione in quanto gli assembly vengono generati sulle macchine dei client e non è possibile fornire loro una chiave per la firma.
  • Potrei provare a giocare con AppDomains per vedere se il debugger può gestire il caso quando gli assembly vengono caricati su domini diversi. Ma anche se potesse, questa sarebbe una modifica enorme (e non pianificata) alla mia applicazione.

Quindi qualcuno potrebbe suggerire qualche altra idea? Thnaks.

+1

Mi rendo conto che hai già trovato una soluzione alternativa, ma non capisco perché firmare gli assembly non è un'opzione qui. Non dovresti fornire loro una chiave (anche se potresti facilmente crearne uno solo per questo scopo e permetterli di usarlo), dato che i tuoi clienti potrebbero crearne uno e usarlo per firmare i loro stessi assembly. Se questo è più un requisito di quanto tu non voglia applicare ai tuoi clienti, potresti addirittura firmare l'assembly da solo prima di caricarlo. Lo strumento Strong Name (sn.exe) può essere utilizzato per firmare un assembly dopo il fatto. – PfhorSlayer

risposta

3

Ho trovato una soluzione per questo problema. Esiste un'opzione in Visual Studio "Debug - Opzioni - Generale - Usa il legacy C# e l'analizzatore di espressioni VB", attivando il ripristino del precedente comportamento del debugger.

enter image description here

Questa opzione è descritta in VS 2015 Known Issues per diverso problema debugger, ma funziona anche per caso descritto.

Ho anche presentato un errore a Microsoft. Non credo che faranno nulla a riguardo, ma ecco il link per ogni evenienza.

0

Supponendo che questa sia un'opzione nella propria situazione, è possibile provare a rinominare la classe o lo spazio dei nomi prima di caricare l'assieme.

Ci sono librerie che possono modificare i file di montaggio: http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection

Questo ovviamente presuppone che si sta caricando il montaggio e tipi in fase di esecuzione.

+0

Lukas, grazie. L'opzione che stai suggerendo è molto ragionevole ma non sembra accettabile per me. Ho un controllo limitato sul processo di build degli assembly client ma non voglio interferire. Poiché gli assembly client contengono codice utente, credo che gli utenti non saranno contenti di eseguire alcuni attacchi post-generazione ai loro assembly. Quindi preferisco avere una patch su VS o fare qualcosa con il codice della mia applicazione che permetta al debugger di funzionare correttamente. – user1921819