Domanda

Ho una soluzione VS (2008) composta da diversi progetti, non tutti nello stesso spazio dei nomi. Quando creo la soluzione, tutte le DLL utilizzate dal progetto di livello superiore TopProject vengono copiate nella cartella TopProject \ bin \ debug . Tuttavia, i file .pdb corrispondenti vengono copiati solo per alcuni degli altri progetti. Questo è un problema, ad esempio quando si utilizza NDepend .

In che modo VS decide quali file .pdb copiare nelle cartelle bin \ debug di livello superiore? Come posso convincere VS a copiare anche gli altri?


Modifica:

I riferimenti sono i seguenti: tutte le DLL vengono copiate in una posizione centrale, senza i loro pdbs. TopProject solo ha riferimenti a queste dll copiate; le stesse DLL, tuttavia, evidentemente sanno dove si trovano i loro pdbs e (la maggior parte di loro) vengono copiate correttamente nella cartella di debug.

È stato utile?

Soluzione

Da MSDN :

  

Conserva un file di database di programma (PDB)   debug e stato del progetto   informazioni che consentono incrementali   collegamento di una configurazione di debug di   il tuo programma. Viene creato un file PDB   quando si compila un programma C / C ++ con   / ZI o / Zi o un oggetto visivo   Programma Basic / C # / JScript .NET con   / Debug.

Quindi sembra che il " issue " qui (per mancanza di una parola migliore) è che alcune delle DLL vengono create in modalità debug (e quindi emettono PDB) e alcune vengono create in modalità di rilascio (quindi non emettono PDB). In tal caso, dovrebbe essere facile da risolvere: vai in ciascun progetto e aggiorna le sue impostazioni di compilazione. Questo sarebbe lo scenario predefinito, se non hai apportato modifiche alle opzioni della riga di comando.

Tuttavia, diventerà più complicato se non è così. Forse siete tutti in modalità di rilascio o debug. Ora è necessario esaminare le opzioni di compilazione della riga di comando (specificate nelle proprietà del progetto) per ciascun progetto. Aggiornali / debug di conseguenza se vuoi il debugger o rimuovilo se non lo fai.

Modifica in risposta alla modifica

Sì, le DLL "conosci " che hanno PDB e hanno percorsi per loro, ma ciò non significa troppo. Copiare solo DLL in una determinata directory, come altri hanno già detto, non risolverà questo problema. Hai bisogno anche dei PDB.

La copia di singoli file in Windows, ad eccezione di alcuni file di tipo "bundle" (non sono il termine di Microsoft per questo, ma "i pacchetti HTML completi" sono il concetto) non copia i file associati. Le DLL non sono assemblate nel " bundle " modo, quindi copiandoli lascia indietro il loro PPB.

Direi che l'unica risposta che avrai sarà di aggiornare il tuo processo per ottenere le DLL in quelle posizioni centrali e includere i PDB ... Mi piacerebbe essere smentito su questo, però!

Altri suggerimenti

Come altri post hanno detto, potresti avere un problema con il compilatore / corruzione.

Ma, come ha detto Will, se i file pdb vengono creati, ma non vengono visualizzati dove li desideri, crea un passaggio post-build. Ecco il passaggio post-build che definisco per ogni progetto nella mia soluzione. Assicura che tutti i file di output vengano copiati in una directory comune.

Se il file proj è in \ SolutionDir \ ProjDir, la prima riga del passaggio post-build copierà i file di output in \ Solution \ Bin \ Release o \ Solution \ Bin \ Debug. La seconda riga copia il file pdb se si tratta di una build di debug. Non copio il file pdb per build di rilascio.

Quindi, \ SolutionDir \ Bin ora contiene tutti i file di output in un'unica posizione.

xcopy /r /y $(TargetPath) $(ProjectDir)..\$(OutDir)
if $(ConfigurationName) == Debug xcopy /r /y $(TargetDir)$(TargetName).pdb $(ProjectDir)..\$(OutDir)

Prima di tutto, non assumere mai nulla. Pulisci la soluzione, ricostruiscila in modalità debug e verifica se tutti i file pdb sono stati creati. In caso contrario, questo è il tuo problema.

Se vengono creati e non vengono tutti copiati, è possibile aggirare il problema creando un evento post build che copia manualmente i file pdb nelle posizioni desiderate. Questa è solo una soluzione alternativa, ovviamente.

L'unica altra cosa a cui riesco a pensare è che il file della soluzione è diventato corrotto. Puoi aprire il tuo .sln come file xml ed esaminare i contenuti. Controlla la configurazione per i progetti che funzionano come previsto e confrontali con quelli che non lo sono. Se non vedi nulla, devi ripeterlo a livello di progetto. Confronta i file di progetto .csproj (o qualunque altro) funzionanti con quelli non funzionanti.


Modifica in risposta alla modifica :

Se stai solo copiando manualmente le cose in giro, copia anche manualmente i pdbs. La Dll non dovrebbe " sapere " qualsiasi cosa su pdbs, credo. Basta attaccarli nella directory di destinazione e andare a prendere una tazza di caffè. Relax.

Controlla quando pulisci la soluzione, che sia effettivamente pulita. Ho visto VS lasciare i file in giro nelle directory bin \ debug anche dopo la pulizia. Elimina la directory bin \ debug su tutti i tuoi progetti e ricostruisci.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top