Domanda

Ecco lo scenario:

Un progetto di applicazione Windows C# archiviato in SVN viene utilizzato per creare un eseguibile.Normalmente, un server di compilazione gestisce il processo di compilazione e crea build a intervalli regolari che vengono utilizzate dai test.In questo caso particolare mi è stato chiesto di modificare una build specifica e creare l'eseguibile.

Non sono del tutto sicuro che il server di compilazione modifichi i file di progetto, ma so che crea un tag in SVN del codice sorgente utilizzato per compilare gli eseguibili.Usando quel tag ho controllato il codice su una seconda macchina, che è una macchina di sviluppo.Ho quindi compilato il sorgente sulla macchina di sviluppo.

Una volta eseguita, l'applicazione compilata sulla macchina di sviluppo non funziona esattamente come quella compilata dal server di compilazione.Ad esempio, sulle macchine di prova viene rilevata dall'applicazione un'eccezione DateTime Parse.Tuttavia, l'eseguibile della macchina di compilazione non genera eccezioni.Se eseguo l'eseguibile sulla macchina di sviluppo non vengono generate eccezioni.

Quindi, in sintesi, entrambe le macchine utilizzano teoricamente lo stesso codice sorgente e gli stessi progetti.
L'eseguibile della macchina di sviluppo funziona solo sulla macchina di sviluppo.L'eseguibile della macchina di compilazione funziona su ogni macchina, inclusa la macchina di sviluppo.

Le impostazioni regionali o il fuso orario della macchina sono memorizzati nell'eseguibile compilato?Qualche idea su cosa potrebbe causare questo comportamento o su come controllare gli eseguibili per trovare le possibili differenze e correggerle?

Sfortunatamente, non posso prendere una macchina di prova e collegarvi un debugger.Appena posso lo farò.

È stato utile?

Soluzione

L'app utilizza le impostazioni regionali del computer su cui è in esecuzione e sembra che si tratti di un tuo problema.È possibile forzare un thread a utilizzare impostazioni cultura specifiche impostando System.Threading.Thread.CurrentThread.CurrentCulture e System.Threading.Thread.CurrentThread.CurrentUICulture su un valore specifico.

Altri suggerimenti

È possibile che le due macchine abbiano versioni diverse di una DLL sottostante che non fa parte del processo di compilazione.L'ho visto accadere durante la distribuzione dei servizi nella nostra server farm interna.

Puoi eseguire il programma sulla macchina di compilazione sotto un debugger?

Se è così, esegui il debug del problema: non c'è bisogno di indovinare.

Chiedi al debugger sulla macchina di sviluppo di rilevare l'eccezione, imposta un punto di interruzione nello stesso punto sulla macchina di compilazione.Guarda cosa c'è di diverso tra i due.

Ho visto diverse "Opzioni internazionali e della lingua" su XP causare questo tipo di comportamento.Corrispondono su entrambe le macchine?Inizio | Impostazioni | Pannello di controllo | Opzioni regionali e linguistiche ...

Ho un paio di domande: entrambe le macchine hanno le stesse impostazioni regionali e dove sono i log degli errori?Spero ;-) che tu abbia delle eccezioni gestite e scritte su disco, registri eventi...qualcosa per aiutare con problemi come questo.

Da dove viene la data che viene analizzata?Se è nel tuo db forse hai anche dati errati.

Ho avuto un problema simile una volta (tranne che in C++). Quando ho confrontato le dimensioni degli eseguibili compilati, erano molto lontani.Sfortunatamente, dopo giorni di ricerche, la soluzione migliore che ho trovato è stata disinstallare VS05 e reinstallarlo.

Perché stai comunque utilizzando un server di compilazione, per il codice C#, se posso chiedertelo?

I tempi di compilazione per C# quando lo utilizzavo erano appena percettibili (<2 s).L'app è davvero così grande?

Il sistema di compilazione probabilmente crea una versione di rilascio, mentre la compilazione manuale sul PC di sviluppo crea una versione di debug.La versione di debug contiene più controlli degli errori.Verifica se riesci a creare manualmente una versione di rilascio e verifica se ci sono ancora differenze.

Lo stesso codice sorgente raramente se ognuno crea lo stesso programma su computer diversi.Dovresti sempre dare per scontato che i programmi siano diversi, non aspettarti mai che siano gli stessi.In un ambiente come Linux con un buon gestore di pacchetti e aggiornamenti periodici e/o casuali, non aspettarti mai che lo stesso codice sorgente crei lo stesso programma sullo stesso computer.Più alta è la lingua, peggio diventa.Costruire un programma per il debugger è drasticamente diverso dalla costruzione per il rilascio.La versione del debugger anche senza il debugger nasconde bug che non troverai finché non passi alla build di rilascio.Fondamentalmente puoi eseguire il debug del programma due volte se ti affidi troppo a un ambiente debugger.

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