web-dev-qa-db-fra.com

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

J'ai développé une application utilisant .net 3.5 et l'ai déployée en tant que .exe sur un certain nombre de machines du même environnement . Cependant, l'erreur suivante est générée sur une machine particulière. Trace de la pile:


Reportez-vous à la fin de ce message pour plus d'informations sur l'appel du débogage JUN (Just-In-Time) au lieu de cette boîte de dialogue.

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)

Assemblées chargées:

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 La valeur jitDebugging de la section system.windows.forms ..__ de cette application ou ordinateur (machine.config) doit être également compilée avec le débogage activé 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 d'être gérée par cette boîte de dialogue.


Est-ce que quelqu'un pourrait m'aider avec ça?

Comme je suis nouveau sur .net, est-ce que quelqu'un pourrait aussi me dire quand un cours temporaire doit être créé?

60
keepsmilinyaar

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

Cependant, cela dépend de la possibilité d'écrire l'assembly sur le disque.1

Vous avez le choix entre (1) le compte d'utilisateur qui exécute l'autorisation d'écriture du 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 (au moment du développement/de la compilation) l'assembly de sérialisation, puis utiliser (et déployer) cet assembly.

1Question ouverte: les API existent pour créer des assemblys de manière dynamique en mémoire: pourquoi ne pas le faire?

30
Richard

Je viens de passer beaucoup de temps à chercher la réponse à cette question et j'ai donc pensé l'ajouter ici pour éviter des maux de tête à d'autres. Si vous utilisez l'outil xsd.exe pour générer votre 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. 

84
Terra

Vous devez uniquement donner les autorisations Lire le contenu du dossier et Lire 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 accès en écriture. 

De Microsoft

24
BillRob

Vous devez donner l'autorisation au dossier temporaire qui se trouve dans le dossier Windows. Et votre problème est résolu ...........

5
Ayush Chaudhary

Vous devez ajouter un utilisateur * IIS_IUSR * disposant d'un droit de lecture/écriture sur le dossier C:\Windows\Temp

NOTE: Tout utilisateur ne fonctionnera pas avec un contrôle total.

2
Hemant

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 -> Activé, la génération de l'assembleur de sérialiseurs XML est forcée au moment de la compilation, ce qui vous évite de le faire au moment de l'exécution.

À son tour, cela signifie que vous n'avez pas besoin de modifier les autorisations du système de fichiers (utile si, par exemple, vous hébergez sur des sites Web Windows Azure, où ce n'est pas une option).

2
rmc47

Il peut également s'agir simplement d'une simple erreur dans la classe sérialisée (généralement due à un copier/coller). Par exemple, la classe suivante provoquera cette erreur:

  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; }
      }
  }

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

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

Si typeof (Propriété) est remplacé par typeof (chaîne) la sérialisation fonctionnera à nouveau.

1
mp31415

C’est peut-être parce que vous changez d’identité de pool d’applications dans IISêtre mot de passe au lieu de prédéfini De sorte que vous avez l’une des options suivantes:

  1. retour au prédéfini 
  2. donnez le contrôle total à l'utilisateur IWAM_WBSRV-01 sur le dossier temporaire Windows
0
abdullah

les API existent pour créer des assemblages de manière dynamique en mémoire: pourquoi ne pas le faire?

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

0
Wiebe Tijsma

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 mon cours, je suis en train de sérialiser et de cesser d'utiliser inéritance. Malheureusement, les avantages de l'héritage ont disparu, mais c'est mieux que d'avoir ce problème. (Hey, au moins je suis à peu près sûr que c'est ce qui a résolu le problème. Il est arrivé de faire un redémarrage là-bas aussi.)

0
ctn

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

0
Brijesh Kansagara