System.InvalidOperationException: impossible de générer une classe temporaire (résultat = 1)

J’ai développé une application en utilisant .net 3.5 et je l’ai déployée en tant que fichier .exe sur un certain nombre de machines avec le même environnement. Cependant, sur une machine particulière, l’erreur suivante apparaît. Trace de la stack:


Voir la fin de ce message pour plus de détails sur l’appel du débogage juste-à-temps (JIT) au lieu de cette boîte de dialog.

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.Comstackr.Comstack(Assembly parent, Ssortingng ns, XmlSerializerComstackrParameters xmlParameters, Evidence evidence) at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, Ssortingng defaultNamespace, Evidence evidence, XmlSerializerComstackrParameters parameters, Assembly assembly, Hashtable assemblies) at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, Ssortingng defaultNamespace, Ssortingng 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) 

Assemblages chargés:

 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 

************** Débogage JIT ************** Pour activer le débogage juste-à-temps (JIT), le fichier .config pour cette application ou ordinateur (machine.config) doit avoir la valeur jitDebugging définie dans la section system.windows.forms. L’application doit également être compilée avec le débogage activé.

Par exemple:

Lorsque le débogage JIT est activé, toute exception non gérée sera envoyée au débogueur JIT enregistré sur l’ordinateur plutôt que gérée par cette boîte de dialog.


Quelqu’un pourrait-il m’aider avec ça?

Comme je suis nouveau sur .net, quelqu’un pourrait-il aussi me dire pourquoi une classe temporaire doit être créée en premier lieu?

La sérialisation XML fonctionne en générant du code pour effectuer la sérialisation. Cela se fait dans un assemblage temporaire créé à cet effet la première fois que cela est nécessaire.

Cependant, cela repose sur la possibilité d’écrire l’assemblage sur le disque. 1

Vos options sont soit (1) étant donné le compte d’utilisateur qui exécute l’autorisation d’écriture de processus (pour une application ASP.NET, cela risque d’être une mauvaise idée). (2) Utilisez l’outil SDK ( sgen.exe ) pour pré-générer (lors du développement / de la compilation) l’assemblage de sérialisation, puis utilisez (et déployez) cet assembly.

1 Question ouverte: les API existent pour créer des assemblages dynamicment en mémoire: pourquoi ne pas le faire?

Je viens de passer beaucoup de temps à chercher la réponse à cette question, alors j’ai pensé l’append ici pour éviter des maux de tête aux autres. Si vous utilisez l’outil xsd.exe pour générer vos cs, il peut avoir ajouté des tableaux doubles [] [] où un tableau doit être []. Remplacez tout [] [] par [] dans votre fichier cs généré et réessayez.

Il vous suffit de donner les permissions de contenu et de lecture du dossier de liste sur% windir% \ Temp.

J’ai trouvé ce message en essayant de résoudre mon problème et je n’ai pas eu à donner à mon compte d’utilisateur un access en écriture.

De Microsoft

Vous devez donner la permission au dossier temp qui se trouve dans le dossier Windows. Et votre problème est résolu ………..

Vous devez append un utilisateur * IIS_IUSR * avec une autorisation d’écriture en lecture sur le dossier C: \ Windows \ Temp .

REMARQUE : tout utilisateur ne fonctionnera pas avec un contrôle total.

Le commentaire de Surfacing @ grzenio un peu plus loin pour les utilisateurs récents:

Si vous allez dans Propriétés du projet -> Construire -> Générer un assemblage de sérialisation -> Activer, cela force la génération de l’assemblage de sérialiseurs XML au moment de la compilation, ce qui élimine le besoin de le faire lors de l’exécution.

Cela signifie que vous n’avez pas besoin de modifier les permissions du système de fichiers (utile si, par exemple, vous hébergez sur des sites Web Windows Azure, ce qui n’est pas une option).

Ce peut être aussi une simple erreur dans la classe sérialisée (généralement un résultat de copier / coller). Par exemple, la classe suivante provoquera cette erreur:

  public class Foo { private ssortingng[] contexts; ///  [System.Xml.Serialization.XmlArrayItemAtsortingbute("Context", typeof(Property), IsNullable = false)] public ssortingng[] Contexts { get { return this.contexts; } set { this.contexts = value; } } } 

Notez que le paramètre typeof (Property) dans l’atsortingbut XmlArrayItem n’est pas compatible (probablement) avec une chaîne provoquant une exception similaire:

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

Si typeof (Property) est remplacé par typeof (ssortingng), la sérialisation fonctionnera à nouveau.

les API existent pour créer des assemblages dynamicment en mémoire: pourquoi ne pas le faire?

Juste une conjecture sauvage: je suppose que cette possibilité n’existait pas encore dans .NET 1.0, ou du moins lorsque XmlSerializer a été créé et que MS n’aime pas changer de comportement existant …

Donnez des privilèges de lecture / écriture au dossier ‘C: \ WINDOWS \ TEMP’. Ça va marcher.

Il se peut que vous changiez d’identité de pool d’applications dans IIS pour qu’elle devienne un mot de passe au lieu de prédéfini.

  1. revenir à prédéfini
  2. donner un contrôle total à l’utilisateur IWAM_WBSRV-01 sur le dossier Windows temp

Au cas où cela aiderait quelqu’un, mon problème venait d’une classe héritée utilisée dans la sérialisation. Le problème a disparu lorsque j’ai fait un copier / coller complet de ma classe que je sérialisais et que je quittais en utilisant l’inéritance. Malheureusement, les avantages de l’inheritance ont disparu, mais c’est mieux que d’avoir ce problème. (Hé, au moins je suis sûr que c’est ce qui a résolu le problème. Il est arrivé de faire un redémarrage là-bas aussi.)