前言:
这是个问题解决,我们先谈问题:
这个问题不会再本地的调试机器上出现,但是,出现在你部署,或者说安装到其他的机器(通过VS构建安装项目来做)
C#程序 Debugger,Release都没问题,但是,打包安装后,报错, 应用程序发生了未经处理的异常。如果点击“继续”应用程序将立即关闭。System.FormatException: 输入字符串的格式不正确。 导致接收数据失败
原因:
笔者出现这个问题的根本原因,花了很长时间才找到:
int imagecount = Convert.ToInt32(ini.ReadValue("Config", "SaveImage"));
这段代码的作用,是从一个配置文件读取保持的图像的数量,然后就是这里,你本地VS上跑完全没问题,但是,一旦安装就有问题。
使用了
Convert.ToInt32
方法来将从配置文件读取的字符串转换为整数。这个方法在内部实际上是调用了int.Parse
方法,所以如果配置文件中的字符串不是有效的整数格式,同样会抛出System.FormatException
异常。
错误的代码:
private void ReadConfig()
{
string Current;
Current = Directory.GetCurrentDirectory();//获取当前根目录
RWIni ini = new RWIni(Current + "//config.ini");
PubVar.Password = ini.ReadValue("Config", "Password");
// PubVar.SaveImage = Convert.ToInt32(ini.ReadValue("Config", "SaveImage"));
// PubVar.SaveDataPath1 = ini.ReadValue("Config", "SaveDataPath1");
PubVar.SaveImageNumMax = Convert.ToInt32(ini.ReadValue("Config", "SaveImageNumMax"));
PubVar.SaveImageDaysMax = Convert.ToInt32(ini.ReadValue("Config", "SaveImageDaysMax"));
}
修改后:
private void ReadConfig()
{
string Current;
Current = Directory.GetCurrentDirectory(); // 获取当前根目录
RWIni ini = new RWIni(Current + "//config.ini");
PubVar.Password = ini.ReadValue("Config", "Password");
// PubVar.SaveImage = Convert.ToInt32(ini.ReadValue("Config", "SaveImage"));
// PubVar.SaveDataPath1 = ini.ReadValue("Config", "SaveDataPath1");
if (!int.TryParse(ini.ReadValue("Config", "SaveImageNumMax"), out int saveImageNumMax))
{
throw new FormatException("配置文件中的 SaveImageNumMax 值格式不正确。");
}
PubVar.SaveImageNumMax = saveImageNumMax;
if (!int.TryParse(ini.ReadValue("Config", "SaveImageDaysMax"), out int saveImageDaysMax))
{
throw new FormatException("配置文件中的 SaveImageDaysMax 值格式不正确。");
}
PubVar.SaveImageDaysMax = saveImageDaysMax;
}
解决方案1:
使用TryParse或TryParseExact方法代替Parse,
解决方案2 :
解决方案源码:
int.TryParse(data[0], out int angle)
double.TryParse(data[1], out double error)