2009-03-18 2 views
58

Ho sviluppato un'applicazione con .net 3.5 e l'ho distribuita come .exe su un numero di macchine con lo stesso ambiente. Tuttavia, su un particolare computer ottengo il seguente errore. Analisi dello stack:System.InvalidOperationException: impossibile generare una classe temporanea (risultato = 1)


vedere la fine di questo messaggio per informazioni su come richiamare just-in-time (JIT) il debug invece di questa finestra di dialogo.

System.InvalidOperationException: Unable to generate a temporary class (result=1). 
error CS2001: Source file 'C:\WINDOWS\TEMP\wz58eig4.0.cs' could not be found 
error CS2008: No inputs specified 

    at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) 
    at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies) 
    at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) 
    at System.Xml.Serialization.XmlSerializer.GetSerializersFromCache(XmlMapping[] mappings, Type type) 
    at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type) 
    at System.Web.Services.Protocols.SoapClientType..ctor(Type type) 
    at System.Web.Services.Protocols.SoapHttpClientProtocol..ctor() 
    at SSOClient..ctor() 
    at sc.tradesvc.SSOManager..ctor() 
    at sc.tradesvc.SSOManager.get_Inst() 
    at sc.cashflowgenerator.Controls.LoginForm.btnLogin_Click(Object sender, EventArgs e) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.PerformClick() 
    at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) 
    at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) 
    at System.Windows.Forms.Control.PreProcessMessage(Message& msg) 
    at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) 
    at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) 

assembly caricati:

mscorlib 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll 

CashflowGenerator 
    Assembly Version: 1.0.0.0 
    Win32 Version: 1.0.0.0 
    CodeBase: file:///C:/DATA/DEVEL/Output/CashflowGenerator.exe 

System.Windows.Forms 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll 

System 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll 

System.Drawing 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll 

System.Configuration 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 

System.Xml 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll 

System.Core 
    Assembly Version: 3.5.0.0 
    Win32 Version: 3.5.21022.8 built by: RTM 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll 

System.Web.Services 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Web.Services/2.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll 

************** JIT debug ************ ** Per abilitare il debug JIT (just-in-time), il file .config per questa applicazione o computer (machine.config) deve avere il valore jitDebugging impostato nella sezione system.windows.forms. L'applicazione deve anche essere compilata con il debug abilitato .

Ad esempio:

Quando il debug JIT è attivato, ogni eccezione non gestita verrà inviato al debugger JIT registrato nel computer, anziché essere gestite da questa finestra di dialogo.


Qualcuno potrebbe aiutarmi con questo?

Come sono nuovo a .net qualcuno potrebbe anche dirmi quando è necessario creare una classe temporanea in primo luogo?

+0

Potresti postare anche del codice, per favore? –

+0

http://www.hanselman.com/blog/ChangingWhereXmlSerializerOutputsTemporaryAssemblies.aspx ha alcune informazioni su questo –

+0

È possibile generare -an-xml-serialization-assembly-as-part-of build e includere nella distribuzione http: // stackoverflow.com/questions/134224/generating-an-xml-serialization-assembly-as-part-of-my-build?rq=1 –

risposta

30

XML La serializzazione funziona generando il codice per eseguire la serializzazione. Questo viene fatto in un assemblaggio temporaneo creato a tale scopo la prima volta che è necessario.

Tuttavia, questo si basa sulla possibilità di scrivere l'assembly su disco.

Le opzioni disponibili sono (1) in base all'account utente su cui è in esecuzione il permesso di scrittura del processo (per un'applicazione ASP.NET è probabile che sia una cattiva idea). (2) Utilizzare lo strumento SDK (sgen.exe) per pre-generare (in fase di sviluppo/compilazione) l'assembly di serializzazione e quindi utilizzare (e deplot) quell'assembly.

Domanda aperta: le API esistono per creare gli assembly dinamicamente in memoria: perché non farlo?

+3

in VS08 Penso che ci sia anche una casella di spunta nelle proprietà del progetto per generarlo. – Grzenio

+1

Se creati in memoria, devono essere ricreati su un riavvio AppDomain. Creali su disco, quindi rimangono sul disco? Non so se questo è il motivo, perché mi chiedo se avrebbero avuto gli stessi nomi dopo il riavvio. –

0

the APIs exist to create assemblies dynamically in memory: why not do that?

Solo un ipotesi: Presumo che questa possibilità non esisteva ancora in .NET 1.0, o almeno quando il XmlSerializer è stato creato e MS non ama cambiare il comportamento esistente ...

24

È è sufficiente fornire le autorizzazioni di visualizzazione e lettura della cartella elenco su% windir% \ Temp.

Ho trovato questo post quando cercavo di risolvere il mio problema e non dovevo concedere l'accesso in scrittura al mio account utente.

From Microsoft

+1

Ricordarsi di selezionare l'account IUSR/IIS_IUSRS corretto su una macchina che fa parte di un dominio. Ho iniziato aggiungendo l'account ISUR per il dominio, ma doveva essere l'account IIS_IUSRS per il computer locale. Non aveva bisogno di accesso in scrittura come dichiarato da BillRob. – Daz

5

È necessario dare il permesso alla cartella Temp che si trova nella cartella di Windows. E il tuo problema è risolto ...........

2

È necessario aggiungere * IIS_IUSR * utente con permesso di lettura in lettura su C: cartella \ Windows \ Temp.

NOTA: tutti gli utenti non funzioneranno con il controllo completo.

0

Concedere i privilegi di lettura/scrittura alla cartella 'C: \ WINDOWS \ TEMP'. Funzionerà.

0

Può essere bacause si sta passando applicazione identità messa in comune in IIS di essere la password al posto di predefinito in modo da avere uno al largo della seguente

  1. ritorno a predefinito
  2. dare prmission pieno controllo di IWAM_WBSRV utente -01 sulla cartella temp di Windows
73

Ho appena trascorso un sacco di tempo a cercare la risposta a questo quindi ho pensato di aggiungerlo qui per salvare un po 'di heada che per gli altri Se si utilizza lo strumento xsd.exe per generare il proprio c, potrebbe essere stato aggiunto un doppio array [] [] dove un array dovrebbe essere []. Sostituisci tutti [] [] con [] nel file cs generato e riprova. commento

+4

Mi hai salvato un sacco di frustrazione, buon suggerimento, thnx :) – Arnstein

+0

Mi sono imbattuto in questo - sono quasi tentato di fare questa domanda esplicita con un titolo più rintracciabile, solo così puoi rispondere di nuovo. Ben individuato! – JerKimball

+3

Questa è la "sola" risposta corretta. Sono rimasto sconcertato quando ho visto il codice generato con i doppi array [] []. Ma felice che tu abbia individuato e capito lo strumento. Molte grazie. –

2

di superfici di @ grzenio un po 'più per le recenti utenti:

Se vai a Proprietà del progetto -> Build -> Genera assembly di serializzazione -> On, costringe la generazione del gruppo serializzatori XML in fase di compilazione, eliminando la necessità di farlo in fase di esecuzione.

A sua volta, ciò significa che non è necessario modificare le autorizzazioni del filesystem (utile se si è, ad esempio, l'hosting su siti Web Windows Azure, dove non è un'opzione).

0

Nel caso in cui questo aiuti qualcuno, il mio problema proveniva da una classe ereditata utilizzata nella serializzazione. Il problema è andato via quando ho fatto una copia/incolla completa della mia classe che stavo serializzando e ho smesso di usare l'inerzia. Sfortunatamente, i vantaggi dell'ereditarietà sono andati via, ma è meglio che avere questo problema. (Ehi, almeno sono abbastanza sicuro che sia quello che ha risolto.)

0

Potrebbe anche essere un semplice errore nella classe serializzata (in genere un risultato di qualche copia/incolla). Per esempio la seguente classe causerà questo errore:

public class Foo 
    { 
     private string[] contexts; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayItemAttribute("Context", 
     typeof(Property), IsNullable = false)] 
     public string[] Contexts 
     { 
      get { return this.contexts; } 
      set { this.contexts = value; } 
     } 
    } 

noti che typeof (proprietà) parametro attributo XmlArrayItem non è compatibile (più probabile) con la stringa che causa un'eccezione simile:

System.InvalidOperationException: 
Unable to generate a temporary class (result=1). 

Se typeof (Proprietà) viene sostituito con typeof (stringa) la serializzazione funzionerà di nuovo.