2010-06-17 13 views
8

SommarioCome si esegue il debug in un assembly ILMerged?

voglio alterare il processo di creazione di una soluzione 2-assemblaggio, in modo tale che una chiamata a ILMerge viene richiamato, ed i risultati costruire in un unico assembly. Inoltre vorrei poter eseguire il debug nell'assemblaggio risultante.

Preparazione - Un semplice esempio

  1. New Solution - ClassLibrary1
  2. Crea una funzione statica 'GetMessage' in Class1 che restituisce la stringa "Ciao mondo"
  3. Crea nuova console app che i riferimenti la ClassLibrary.
  4. Uscita GetMessage da main() tramite la console.

Ora si dispone di un'app 2 di montaggio che emette "Hello World" sulla console.

Quindi cosa succederà ..?

vorrei alterare il processo di applicazione di generazione della console, di includere una fase di post costruzione che utilizza ILMerge, per unire il gruppo ClassLibrary nel gruppo consolle

Dopo questo passo che dovrebbe essere in grado di:

  • eseguire l'applicazione Console direttamente senza ClassLibrary1.dll presente
  • eseguire l'applicazione console tramite F5 (o F11) in VS ed essere in grado di eseguire il debug in ciascuno dei 2 progetti.

limitato successo

ho letto this blogpost ed è riuscito a raggiungere l'unione che cercavo con un comando post-generazione di ...

"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName) 

... ed un ILMerge. bat file che leggono ...

CD %1 
Copy %2.exe temp.exe 
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll 
Del temp.exe 
Del ClassLibrary1.* 

Questo funziona abbastanza bene, e in effetti pro duce un exe che funziona al di fuori dell'ambiente VS come richiesto. Tuttavia non sembra che produca simboli (file .pdb) che VS è in grado di utilizzare per eseguire il debug nel codice.

Penso che questo sia l'ultimo pezzo del puzzle.

Qualcuno sa come posso farlo funzionare?

FWIW Sto eseguendo VS2010 su una macchina x64 Win7 x64.

Aggiornamento: Perché voglio farlo?

E 'stato chiesto:' Ho davvero bisogno di eseguire ILMerge durante lo scenario di debug?'

Le assemblee della mia soluzione dovranno coesistere nella stessa cartella di quelli di altre soluzioni (alcune delle quali mi sarà probabilmente sviluppare)

Alcune di queste soluzioni si divideranno le dipendenze su diverse versioni di alcune assemblee.

Quindi Soluzione1 potrebbe essere costituito da Console1 e ClassLibrary1.dll (v1) e Solution2 potrebbe essere costituito da Console2 e Classlibrary1.dll (v2).

Anziché registrare tutto nel GAC, ho pensato di poter visualizzare la versione corretta di una dipendenza nell'assembly principale della soluzione per evitare una collisione.

Tuttavia ciò attualmente rende impossibile il debug della soluzione, che è necessario eseguire in combinazione con le altre soluzioni che saranno presenti.

Questo sembra complicato? Questo perché è ..: D

+0

Invece di avere uno script .bat, una cosa che si potrebbe fare è creare un terzo progetto (tipo ClassLibrary funzionerà) le cui dipendenze sono ConsoleApp e ClassLibrary; chiamalo PostSolutionBuildEvents.Quindi il suo post-build deve essere un comando ILMerge. In questo modo, avrai accesso a tutte le macro come '$ (SolutionDir)'. –

+1

Nota: non dovresti avere bisogno di cose GAC per questo scopo, ci sono una quantità enorme di opzioni che vanno da "funziona" quando nulla è GACd ai file di configurazione dell'applicazione –

+1

hai mai risolto questo? lo stesso problema qui ... –

risposta

1

Ti suggerisco di creare solo versioni di ILMerge dei tuoi assembly. Non riesco a immaginare alcun beneficio derivante dall'unione degli assembly di debug.

+0

Ho aggiunto alla mia domanda iniziale spiegando (tipo di) perché vorrei farlo. –

+0

Per quanto riguarda il tuo aggiornamento, penso che stai facendo più problemi, quindi stai risolvendo cercando di percorrere questa strada. Inizia una nuova domanda usando il tuo aggiornamento come domanda: c'è sicuramente una soluzione migliore rispetto all'approccio che stai provando. –

+0

Non sono sicuro di aver capito ... Che cosa stai suggerendo di chiedere? –

-1

Non credo che ILMerge possa farlo. OTOH smartassembly da red-gate (non gratuito) può farlo, almeno così dice a features

E sì, sono d'accordo con Mike per usare solo ILMerge per le versioni di rilascio.

4

Mi dispiace che tu stia avendo problemi. Non ho seguito i tuoi passi esatti, ma ho creato un'applicazione console, A.exe, che ha chiamato un metodo in una DLL, B.dll. Ho costruito entrambi gli assembly in modalità debug (in modo che avessero i file PDB). Io poi li fusi in questo modo:

ILMerge /out:foo.exe a.exe B.dll

(In realtà A e B erano in un'altra directory così la mia linea di comando è stato un po 'più complicata , ma ciò non dovrebbe fare la differenza). Dopo aver completato ILMerge, c'erano due file nella directory corrente: foo.exe e foo.pdb. Allora ho digitato:

devenv foo.exe

Questo ha aperto Visual Studio e poi mi ha colpito "F10" per avviare il debugger. Sono stato in grado di passare al metodo Main nell'eseguibile e quindi ho usato "F11" per passare al metodo che era originariamente in B.dll. L'esperienza di debug era identica a quella della soluzione originale di Visual Studio con i due assembly.

Se si continua ad avere problemi, non esitate a mettere la vostra intera soluzione in un file zip e inviarlo a me (mbarnett a Microsoft dot com) e posso provarlo.

+1

+1 per una risposta dall'autore di ILMerge! Il file .pdb risultante funziona correttamente per me, se si trova nella stessa directory dell'assieme unito (exe nel mio caso). Vedi domande/risposte simili http://stackoverflow.com/questions/1439721/is-there-a-way-to-merge-pdb-files-with-ilmerge – joelsand

+0

Ha funzionato perché non hai rinominato le cose (vedi la mia risposta) . –

0

Ho provato a fare qualcosa del genere e ho trovato che non dovresti rinominare nulla, né prima né dopo l'unione. Spostare cose per separare la directory va bene. Se non si rinomina nulla, funziona.

Problemi correlati