2011-07-20 2 views
2

J'ai créé un programme qui fonctionne bien sur mon ordinateur (s) et normalement aussi sur d'autres ordinateurs. Cependant, il y a une personne qui a un problème lors de l'exécuter et je ne comprends vraiment pas pourquoi, le Stacktrace est:XmlSerializer désertification bug avec CSC.EXE

System.Runtime.InteropServices.ExternalException (0x80004005): Impossibile eseguire un programma. Il comando dans l'ère d'ésecuzione "C: \ Windows \ Microsoft.NET \ Cadre64 \ v4.0.30319 \ c sc.exe"/noconfig /fullpaths @ "C: \ Utilisateurs \ Andry \ AppData \ Local \ Temp \ dot0eqxi.cmdli ne ". ---> System.ComponentModel.Win32Exception (0x80004005): Erreur inconnue (de 0x36b1) dans System.CodeDom.Compiler.Executor.ExecWaitWithCaptu reUnimpersonated (SafeUserTokenHandle UserToken, String cmd, String CurrentDir, TempFileCollection tempfiles, String & outputName, chaîne & errorname, string trueCmdLine) dans System.CodeDom.Compiler.Executor.ExecWaitWithCaptu re (SafeUserTokenHandle UserToken, string cmd, string CurrentDir, tempfiles de TempFileCollection, string & outputName, string & errorname, chaîne trueCmdLine) dans Microsoft .CSharp.CSharpCodeGenerator.Com pile (COMPI lerParameters options, chaîne compilerDirectory, String compilerExe, String arguments, cordes & OUTPUTFILE, Int32 & nativeReturnValue, cordes trueArgs) dans Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (options CompilerParameters, String []) dans les noms de fichiers Microsoft .CSharp.CSharpCodeGenerator.FromSourceBat ch (options CompilerParameters, String [] sources) Microsoft.CSharp.CSharpCodeGenerator.System.CodeDo m.Compiler.ICodeCompiler.CompileAssemblyFromSource lot (options CompilerParameters, String [] sources) dans système .Xml.Serialization.Compiler.Compile (Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, preuve de preuve) dans System.Xml.Serialization.TempAssembly.GenerateAsse mbly (XmlMapping [] xmlMappings, tapez [] types, chaîne defaultNamespace, la preuve, la preuve paramètres XmlSerializerCompilerParameters, assemblage de montage, ensembles Hashtable) dans System.Xml.Serialization.TempAssembly..ctor (XmlMap ping [] xmlMappings, Type [] types, Chaîne defaultNamespace, Emplacement de la chaîne, Evidence evidence) dans System.Xml.Serialization.XmlSerializer..ctor (Type de type, Chaîne defaultNamespace) dans SpellCaster3.Program.LoadBaseRange() dans SpellCaster3.Program.Main()

Comme vous pouvez le voir le problème est lié à la désérialisation (cet objet est seulement désérialisé) et cela se produit dans le constructeur XmlSerializer.

Le problème peut être relié de quelque façon à cette question: Why is my windows service launching instances of csc.exe? et Why is my windows service launching instances of csc.exe?

Je ne peux pas obviusly reproduire le bug. Voici le code impliqué:

Programme.cs

private static void LoadBaseRange() 
    { 
     string fileIconImageIndices = Application.StartupPath + Path.DirectorySeparatorChar + "ValidIconImageIndices.xml"; 
     if (!File.Exists(fileIconImageIndices)) throw new FileNotFoundException("Attenzione, il file degli indici delle immagini non è stato trovato"); 

     using (StreamReader reader = new StreamReader(fileIconImageIndices, Encoding.UTF8)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(RangeCollection)); 
      Forms.GumpPicker.BaseRange = serializer.Deserialize(reader) as RangeCollection; 
     } 
    } 

    /// <summary> 
    /// Punto di ingresso principale dell'applicazione. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.ApplicationExit += new EventHandler(Application_ApplicationExit); 
     try 
     { 
      LoadBaseRange(); 
     } 
     catch (FileNotFoundException fileException) 
     { 
      ErrorForm.Show(fileException.Message + "\nL'applicazione verrà terminata", fileException); 
      return; 
     } 
     catch (Exception exception) 
     { 
      ErrorForm.Show("L'applicazione verrà terminata", exception); 
      return; 
     } 

RangeCollection.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 

namespace Expand.Linq 
{ 
    public class RangeCollection : IXmlSerializable 
    { 
     public static readonly Version Version = new Version(1, 0, 0, 0); 

     internal static Version FoundVersion { get; private set; } 

     /// <summary> 
     /// Used for xml deserialization 
     /// </summary> 
     public RangeCollection() { } 

     public RangeCollection(IEnumerable<IEnumerable<int>> ranges) 
     { 
      Range = ConvertToListInt(ranges); 
     } 

     private List<int> ConvertToListInt(IEnumerable<IEnumerable<int>> ranges) 
     { 
      IEnumerable<int> tmpRange; 
      tmpRange = Enumerable.Empty<int>(); 

      foreach (IEnumerable<int> range in ranges) 
       tmpRange = tmpRange.Union(range); 

      tmpRange = tmpRange.OrderBy(number => number); 
      return new List<int>(tmpRange); 
     } 


     public static implicit operator RangeCollection(List<IEnumerable<int>> ranges) 
     { 
      return new RangeCollection(ranges); 
     } 

     public List<int> Range { get; private set; } 

     public int Maximum 
     { 
      get 
      { 
       return Range.Max(); 
      } 
     } 

     public int Minimum 
     { 
      get 
      { 
       return Range.Min(); 
      } 
     } 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      List<IEnumerable<int>> ranges = new List<IEnumerable<int>>(100); 
      string elementName = "Range"; 
      Version version; 

      version = Version.Parse(reader.GetAttribute("Version")); 
      FoundVersion = version; 

      if (reader.IsEmptyElement) return; 

      reader.ReadStartElement(GetType().Name); 
      while (true) 
      { 
       if (reader.NodeType == XmlNodeType.Element && reader.LocalName == elementName) 
       { 
        reader.ReadStartElement(elementName); 
        int start = reader.ReadElementContentAsInt(); 
        int end = reader.ReadElementContentAsInt(); 
        reader.ReadEndElement(); 
        if (start == end) 
         ranges.Add(ExEnumerable.Range(start)); 
        else 
         ranges.Add(ExEnumerable.RangeBetween(start, end)); 
       } 
       else 
        break; 
      } 
      reader.ReadEndElement(); 
      Range = ConvertToListInt(ranges); 
     } 

     public void WriteXml(System.Xml.XmlWriter writer) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 

ValidIconImageIndices.xml (fichier XML impliqué)

<?xml version="1.0" encoding="utf-8" ?> 
<RangeCollection Version="1.0.0.0"> 
    <Range> 
    <Start>1236</Start> 
    <End>1246</End> 
    </Range> 
    <Range> 
    <Start>1260</Start> 
    <End>1260</End> 
    </Range> 
    <Range> 
    <Start>1263</Start> 
    <End>1287</End> 
    </Range> 
    <Range> 
    <Start>1300</Start> 
    <End>1309</End> 
    </Range> 
    <Range> 
    <Start>1311</Start> 
    <End>1312</End> 
    </Range> 
    <Range> 
    <Start>1401</Start> 
    <End>1415</End> 
    </Range> 
    <Range> 
    <Start>1782</Start> 
    <End>1782</End> 
    </Range> 
    <Range> 
    <Start>1789</Start> 
    <End>1795</End> 
    </Range> 
    <Range> 
    <Start>2240</Start> 
    <End>2303</End> 
    </Range> 
    <Range> 
    <Start>2406</Start> 
    <End>2408</End> 
    </Range> 
    <Range> 
    <Start>2410</Start> 
    <End>2419</End> 
    </Range> 
    <Range> 
    <Start>20480</Start> 
    <End>20496</End> 
    </Range> 
    <Range> 
    <Start>20736</Start> 
    <End>20745</End> 
    </Range> 
    <Range> 
    <Start>20992</Start> 
    <End>21020</End> 
    </Range> 
    <Range> 
    <Start>21248</Start> 
    <End>21248</End> 
    </Range> 
    <Range> 
    <Start>21251</Start> 
    <End>21257</End> 
    </Range> 
    <Range> 
    <Start>21280</Start> 
    <End>21287</End> 
    </Range> 
    <Range> 
    <Start>21504</Start> 
    <End>21507</End> 
    </Range> 
    <Range> 
    <Start>21536</Start> 
    <End>21542</End> 
    </Range> 
    <Range> 
    <Start>21632</Start> 
    <End>21632</End> 
    </Range> 
    <Range> 
    <Start>23000</Start> 
    <End>23015</End> 
    </Range> 
</RangeCollection> 

Je ne connais pas les pouvant être élué de l'utilisateur mais je pense que c'est Windows 7 home 64 bits. Il a .NET 4.0 et l'application est une application Winforms pour .net 4.0

Lien vers l'application si vous voulez le tester: http://dl.dropbox.com/u/762638/Files/Documents/My%20Programs/SpellCaster3/SpellCaster3.zip

Lien avec l'installateur: http://dl.dropbox.com/u/762638/Files/Documents/My%20Programs/SpellCaster3/setup.zip

+0

Pouvez-vous configurer le débogage à distance sur sa machine? –

+0

Je ne sais pas comment faire, mais je peux essayer, mais pas "aujourd'hui", j'ai besoin de son skype d'abord –

+0

Mhh débogage à distance besoin d'une chose comme une connexion LAN? Parce que je ne sais pas comment voir son compte Windows –

Répondre

6

Le compilateur C# (csc.exe) ne peut pas démarrer sur cette machine. Le code d'erreur est misérable, E_FAIL qui ne signifie rien de plus que "ça n'a pas marché, je ne sais pas pourquoi". Le compilateur C# est nécessaire ici pour générer l'assembly de sérialisation XML.

Ceci est un problème environnemental, cela n'a rien à voir avec votre code. Étant donné le code d'erreur moche, ça pourrait être n'importe quoi. Les scanners Malware conduisent généralement le pack dans des causes de problèmes comme ça. C'est un problème que l'équipe informatique de l'utilisateur doit résoudre, il y a très peu de choses que vous pouvez faire à ce sujet. Bien que vous puissiez utiliser sgen.exe pour pré-générer l'assembly de sérialisation à l'avance afin qu'il ne doit pas être fait sur la machine de l'utilisateur.

+1

Cela semble être une évaluation juste de l'erreur. +1 Pour la solution sgen.exe. Il va également augmenter les performances de l'application (démarrage) –

+0

+1 pour sgen.exe –

+0

Si je comprends comment faire fonctionner sgen je vais l'essayer: P En passant merci pour suggestion. Je lui ai demandé de réinstaller .NET 4, peut-être va travailler –

Questions connexes