Ошибка десериализации XmlSerializer с CSC.EXE - PullRequest
2 голосов
/ 20 июля 2011

Я создал программу, которая хорошо работает на моих компьютерах и обычно на других компьютерах.Однако есть один человек, который испытывает проблемы при запуске, и я действительно не понимаю, почему, Stacktrace:

System.Runtime.InteropServices.ExternalException (0x80004005): Impossibile eseguire un programma,Il comando в эпоху преследования "C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ c sc.exe" / noconfig / fullpaths @ "C: \ Users \ Andry \ AppData \ Local \ Temp \ dot0eqxi.cmdli ne",---> System.ComponentModel.Win32Exception (0x80004005): неизвестная ошибка (0x36b1) в System.CodeDom.Compiler.Executor.ExecWaitWithCaptu) в System.CodeDom.Compiler.Executor.ExecWaitWithCaptu re (SafeUserTokenHandle userToken, String cmd, String currentDir, TempFileCollection tempFiles, String & outputName, String & errorName, String trueCmdLine, параметры String и Compress.String compilerExe, String arguments, String & outputFile, Int32 & nativeReturnValue, String trueArgs) в Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (параметры CompilerParameters, String [] fileNames) в Microsoft.CSharp.CSharpCodeGenerator.FromSilerPatters)в Microsoft.CSharp.CSharpCodeGenerator.System.CodeDo m.Compiler.ICodeCompiler.CoПакет mpileAssemblyFromSource (параметры CompilerParameters, источники String []) в System.Xml.Serialization.Compiler.Compile (родительский узел сборки, String ns, XmlSerializerCompilerParameters xmlParameters, свидетельства доказательств) в System.Xml.Serialization.TempAssembly.GenerateAsMapping [XenerateAsMapping] Xml (), Type [] types, String defaultNamespace, Доказательства, параметры XmlSerializerCompilerParameters, сборка Assembly, сборки Hashtable) в System.Xml.Serialization.TempAssembly..ctor (XmlMap ping [] xmlMappings, Type [] types, String defaultNamespace, String location,Доказательства) в System.Xml.Serialization.XmlSerializer..ctor (Тип тип, String defaultNamespace) в SpellCaster3.Program.LoadBaseRange () в SpellCaster3.Program.Main ()

Как вы можете видетьпроблема связана с десериализацией (этот объект только десериализован), и это происходит в конструкторе XmlSerializer.

Проблема может быть как-то связана с этим вопросом: Почему мой ветерДолжны ли службы запускать экземпляры csc.exe? и Почему моя служба Windows запускает экземпляры csc.exe?

Я, очевидно, не могу повторить ошибку.Вот код:

Program.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 (с файлом XML)

<?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>

Я не знаю ОС пользователя, но думаю, что это Windows 7 home 64 bit.У него есть .NET 4.0 и приложение Winforms для .net 4.0

Ссылка на приложение, если вы хотите проверить его: http://dl.dropbox.com/u/762638/Files/Documents/My%20Programs/SpellCaster3/SpellCaster3.zip

Ссылка с установщиком: http://dl.dropbox.com/u/762638/Files/Documents/My%20Programs/SpellCaster3/setup.zip

1 Ответ

6 голосов
/ 20 июля 2011

Компилятор C # (csc.exe) не может запуститься на этом компьютере.Код ошибки жалкий, E_FAIL, который не означает ничего, кроме «это не сработало, не знаю почему».Компилятор C # необходим здесь для генерации сборки сериализации XML.

Это проблема среды, она не имеет никакого отношения к вашему коду.Учитывая паршивый код ошибки, это может быть что угодно.Сканеры вредоносных программ обычно приводят к возникновению подобных проблем.Это проблема, которую должна решить ИТ-команда пользователя, и с ней мало что можно поделать.Хотя вы можете использовать sgen.exe для предварительной генерации сборки сериализации заранее, чтобы этого не требовалось делать на компьютере пользователя.

...