2015-08-31 12 views
0

Я столкнулся с проблемой: приложение, разработанное на Microsoft Visual Studio 2013 в .NET 4.5, должно работать в Windows XP Platforms. Я перестраиваю программное обеспечение с помощью .NET 4.0 и вношу некоторые изменения, чтобы добавить совместимость, но когда я нажимаю кнопку, приложение вылетает и не отображает ясное сообщение об ошибке, а ресурс трассировки ничего не записывает. При запуске приложения у меня появилось небольшое окно, в котором попросите пользователя поместить ваше имя, и эта функция работает нормально. У кого-нибудь есть предложение, что я могу сделать?Приложение Wpf на .NET 4.5 до .NET 4.0

EDIT 1:

Код следует за корень проблемы, этот код был скомпилирован с использованием .NET 4.0:

SerialManager.cs

using System; 
using System.Windows; 
using TestSat; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.IO.Ports; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 
using System.Text.RegularExpressions; 
using System.Diagnostics; 

namespace TestSat.DataModel 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public class SerialManager : INotifyPropertyChanged 
    { 

     #region Events 

     public event PropertyChangedEventHandler PropertyChanged; 
     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="propertyName"></param> 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     /* [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] 
     public sealed class CallerMemberNameAttribute : Attribute 
     { 
     }*/ 

     /// <summary> 
     /// 
     /// </summary> 
     /// <typeparam name="T"></typeparam> 
     /// <param name="field"></param> 
     /// <param name="value"></param> 
     /// <param name="propertyName"></param> 
     /// <returns></returns> 
     protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) 
     { 
      if (EqualityComparer<T>.Default.Equals(field, value)) return false; 
      field = value; 
      OnPropertyChanged(propertyName); 
      return true; 
     } 
     #endregion 

     #region Private Fields 

     private static SerialPort PortaSerial; 
     private ObservableCollection<String> mPorts; 
     private String mSelectedPort; 
     private int mBaudRate = 115200; 
     private int mDataBits = 8; 

     #endregion 

     #region Public Fields 
     public StringBuilder logText; 
     #endregion 

     #region Properties 

     /// <summary> 
     /// 
     /// </summary> 
     public ObservableCollection<String> COMPorts 
     { 
      get { return mPorts; } 
      set { SetField(ref mPorts, value); } 
     } 



     /// <summary> 
     /// 
     /// </summary> 
     public String TextoLog 
     { 
      get { return logText.ToString(); } 
      set 
      { 

       if (logText.Length >= logText.MaxCapacity) 
       { 
        logText.Clear();; 

        logText.Append(value); 
       } 
       else 
       { 
        logText.Append(value); 
        //MainWindow.last = value; 
       } 
       OnPropertyChanged("TextoLog"); 
      } 

     } 

     /// <summary> 
     /// 
     /// </summary> 
     public String SelectedPort 
     { 
      get { return mSelectedPort; } 
      set {SetField(ref mSelectedPort, value); } 
     } 

     #endregion 

     #region Construtors 

     /// <summary> 
     /// 
     /// </summary> 
     public SerialManager() 
     { 
      InitComponents(); 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     private void InitComponents() 
     { 
      RefreshPorts(); 

      /*Initialize the log variable*/ 
      logText = new StringBuilder(); 

      /* Update selected port */ 
      SelectedPort = COMPorts.Count > 0 ? COMPorts[0] : ""; 


     } 

     #endregion 

     #region Public Methods 

     /// <summary> 
     /// 
     /// </summary> 
     public void RefreshPorts() 
     { 
      // Update ports 
      string[] pPorts = SerialPort.GetPortNames(); 
      // Sort alphabetically 
      Array.Sort(pPorts); 
      // Sort by string length 
      Array.Sort(pPorts, (x, y) => x.Length.CompareTo(y.Length)); 

      // Create collection 
      COMPorts = new ObservableCollection<string>(pPorts); 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="mSelectedPort"></param> 
     public void ConnectSerial(String mSelectedPort) 
     { 
      PortaSerial = new SerialPort(); 
      PortaSerial.PortName = mSelectedPort; 
      PortaSerial.BaudRate = mBaudRate; 
      PortaSerial.Parity = Parity.None; 
      PortaSerial.DataBits = mDataBits; 
      PortaSerial.StopBits = StopBits.One; 
      PortaSerial.Handshake = Handshake.None; 
      PortaSerial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
      Trace.WriteLine("DataReceived definida"); 
      try 
      { 
       PortaSerial.Open(); 
      } 
      catch (SystemException) 
      { 
       MessageBox.Show("A porta serial esta sendo usada em outra aplicação.", "Erro", MessageBoxButton.OK); 
       throw new SystemException(); 
      } 

     } 

     /// <summary> 
     /// 
     /// </summary> 

     public void DesconnectSerial() 
     { 
      if (PortaSerial.IsOpen) 
      { 
       PortaSerial.Close(); 
      } 
     } 

     /// <summary> 
     /// 
     /// </summary> 
     public void writeSerial(String text) 
     { 
      if (PortaSerial.IsOpen) 
      { 
       if (text.Length > 0) 
       { 
        /* char[] array = text.ToCharArray(0,text.Length); 
        foreach(char ch in array) 
        { 
         PortaSerial.Write(ch.ToString()); 
         Thread.Sleep(50); 

        }*/ 
        PortaSerial.WriteLine(text); 
       } 
       else 
       { 
        PortaSerial.WriteLine(""); 
       } 

      } 
      else 
      { 
       MessageBox.Show("Porta serial não esta aberta.", "Erro", MessageBoxButton.OK); 
       Console.WriteLine("Porta serial não esta aberta"); 
      } 


     } 

     /// <summary> 
     /// 
     /// </summary> 
     public bool IsOpen() 
     { 
      return PortaSerial.IsOpen; 
     } 


     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
     { 

      MainWindow.StartRawData = true; 
      SerialPort sp = (SerialPort)sender; 
      string indata = sp.ReadExisting(); 
      TextoLog = indata; 

      /*Omited code only logical operation*/ 

     } 

     #endregion 
    } 
} 

Если я дон Не делайте никаких экземпляров или ссылок на последовательный порт, приложения не выходят из строя. Есть способ заставить эту часть кода скомпилировать .NET 3.5? Или существует другое предположение о решении этой проблемы?

+0

Если у вас есть источник, вы должны добавить больше регистрации ошибок или подключить удаленный отладчик. Учитывая предоставленную вами информацию, ее будет сложно предложить кому-нибудь, что делать. Приложения .NET 4 WPF совместимы с Windows XP, поэтому есть что-то, что вы делаете, это несовместимо с кодом (который вы не предоставили). –

+1

Посмотрите в журнал событий приложений Windows, запустив eventvwr.exe – spender

+0

Windows XP не поддерживается, ** даже Microsoft **, почему вас это волнует? –

ответ