C# .NET4.5到.NET4.0上的Wpf应用程序
我面临以下问题:在.NET 4.5中,在Microsoft Visual Studio 2013上开发的应用程序需要在Windows XP平台上工作。我正在使用.NET 4.0重建软件并进行一些修改以增加兼容性,但当我单击按钮时,应用程序崩溃,没有显示明确的错误消息,跟踪资源也没有记录任何内容。在应用程序启动时,我有一个小窗口,要求用户输入您的姓名,该功能运行良好。有人对我能做什么有什么建议吗 编辑1: 以下代码是问题的根源,此代码是使用.NET 4.0编译的: SerialManager.csC# .NET4.5到.NET4.0上的Wpf应用程序,c#,.net,wpf,serial-port,windows-xp-sp3,C#,.net,Wpf,Serial Port,Windows Xp Sp3,我面临以下问题:在.NET 4.5中,在Microsoft Visual Studio 2013上开发的应用程序需要在Windows XP平台上工作。我正在使用.NET 4.0重建软件并进行一些修改以增加兼容性,但当我单击按钮时,应用程序崩溃,没有显示明确的错误消息,跟踪资源也没有记录任何内容。在应用程序启动时,我有一个小窗口,要求用户输入您的姓名,该功能运行良好。有人对我能做什么有什么建议吗 编辑1: 以下代码是问题的根源,此代码是使用.NET 4.0编译的: SerialManager.cs
如果我不执行任何实例或对串行端口的引用,则应用程序不会崩溃。是否存在强制.NET3.5编译这部分代码的方法?或者是否存在解决此问题的其他建议?我在第8期找到的解决方案。安装.NET 4.0更新后,问题不再出现。如果您有源代码,则应添加更多错误日志记录,或附加远程调试器。考虑到你提供的信息,任何人都很难提出建议。NET 4 WPF应用程序与Windows XP兼容,因此您正在执行的某些操作与您未提供的代码不兼容。请通过运行eventvwr查看Windows应用程序事件日志。EXEVENT Windows XP不受支持,即使是Microsoft也不受支持,您为什么要关心这一点?@HighCore:不支持或不支持,XP在很多地方。通常情况下,企业不想花费数百万美元为本应在5年前退役的现有计算机授权。为AppDomain.CurrentDomain.UnhandledException事件编写事件处理程序从来都不是可选的。请确保记录或显示e.ExceptionObject.ToString的值,以便您知道它失败的原因。
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
}
}