.NET 4.5 到 .NET 4.0 上的 Wpf 应用程序

Wpf application on .NET 4.5 to .NET 4.0

我面临以下问题:在 Microsoft Visual Studio 2013 .NET 4.5 中开发的应用程序需要在 Window XP 平台上运行。我正在使用 .NET 4.0 重建软件并进行一些修改以增加兼容性,但是当我单击按钮时,应用程序崩溃并且不显示明确的错误消息并且 Trace 资源不记录任何内容。在应用程序启动时,我有一点 window 要求用户输入你的名字,这个功能工作正常。有人对我能做什么有什么建议吗?

编辑 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 编译?或者存在解决此问题的其他建议?

我在 http://blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.asp 第 8 期找到的解决方案。安装 .NET 4.0 更新后问题不再发生。