6

Ci siamo imbattuti in un problema interessante che non avevo mai sperimentato prima. Abbiamo un progetto di app Web ASP.NET 3.5 SP1 su larga scala in Visual Studio 2008 SP1 che viene compilato e distribuito utilizzando un progetto di distribuzione del sito Web. Tutto ha funzionato bene per l'anno scorso, fino a dopo un check-in l'app ha iniziato a fallire in modo critico con BadImageFormatException.Esistono limiti di dimensioni al formato di Assemblaggio .NET?

Il check-in in questione non cambia nulla di particolarmente speciale e gli errori provengono da aree dell'app non sono nemmeno cambiati. Usando Reflector abbiamo ispezionato i metodi incriminati per scoprire che nel codice c'erano stringhe di garbage (which .NET Reflector humorously interpreted as Chinese characters). Lo abbiamo riprodotto in modo coerente su diverse macchine, quindi non sembra essere correlato all'hardware.

Un'ulteriore ispezione ha mostrato che quelle stringhe di immondizia non erano non esistenti negli Assiemi utilizzati come input su aspnet_merge.exe durante l'implementazione.

aspnet_merge.exe/Web Output progetto Deployment assiemi Proprietà:

  • Unisci tutte le uscite ad un unico assembly
  • Merge ogni uscita singola cartella a propria assemblea
  • unire tutte le pagine e uscite di controllo a un singolo assieme
  • Creare un assieme separato per ogni pagina e l'uscita di controllo

nelle proprietà del progetto di distribuzione web, se si impostano le opzioni di unione per la prima opzione ("Unisci tutte le uscite ad un unico montaggio") si verifica il problema, eppure tutte le altre opzioni funzionano perfettamente!

La mia domanda: qualcuno sa perché questo sta accadendo? Esiste un limite per le dimensioni delle funzionalità di aspnet_merge.exe (la risultante DLL unita è di circa 19,3 MB)? Ci sono altri problemi noti con la fusione dell'output di WAP?

Mi piacerebbe se qualche guru di formato Assembly/aspnet_merge.exe fosse a conoscenza di tali limiti di questo tipo. Mi sembra come un Assemblea da 25 MB, mentre grande, non è scandaloso.

+0

È possibile correggere l'immagine o rimuovere il collegamento? – Laurel

risposta

2

Si potrebbe provare a eseguire PEVerify su di esso e vedere ciò che si ottiene.

Per me sembra un problema di codifica ... ma non sono sicuro del perché ciò potrebbe accadere. Esiste tecnicamente un limite alla quantità di metadati che possono rientrare nelle tabelle dei metadati in un assembly, ma dubito che questo sia il problema.

Si può vedere la dimensione delle tabelle dei metadati se si apre l'exe in Ildasm, si potrebbe provare a guardare le statistiche (Visualizza-> Statistiche) oi conteggi delle tabelle dei metadati che è un processo in 2 fasi: 1. Visualizza-> Metainfo-> Raw: Count, Sizes 2. Premere Ctrl + M

+0

Grazie per gli strumenti. Dovrò provare quelli e riferire su ciò che trova.Quando uso Reflector per esaminare il metodo incriminato (vedi lo screenshot qui sopra), è abbastanza chiaro dove l'assembly non è corretto. PEVerify direbbe semplicemente * dove * non è corretto o sarebbe in grado di dire * perché * pure? – mckamey

+0

Se ricordo correttamente (è passato un po 'da quando l'ho usato), sì indicherà quali errori trova nei metadati. Tuttavia potrebbe essere necessario aprirlo in ildasm per tradurre alcune delle cose come i token che saranno menzionati nei messaggi di errore. PEVerify è anche uno strumento piuttosto grezzo, il che significa che non è progettato per lo sviluppatore di tutti i giorni, potrebbe essere necessario consultare alcuni dei messaggi di errore per vedere di cosa si tratta. –

0

Non viene generata l'eccezione BadImageFormatException quando si tenta di eseguire il codice x64 su x86?

+0

Questa è una delle situazioni in cui ciò si verifica (http://msdn.microsoft.com/en-us/library/system.badimageformatexception.aspx) ma in questo caso non è quello. I singoli assemblaggi funzionano bene da soli ma falliscono una volta uniti. – mckamey

Problemi correlati