VS 2017 中的 ConfigurationManager 问题
ConfigurationManager issue in VS 2017
以下代码,当 运行 在 Visual Studio 2015 年及更早时,会导致消息框显示预期值“12345”。
string executablePath = Application.ExecutablePath;
executablePath = Path.GetFileNameWithoutExtension(executablePath);
executablePath = executablePath + ".vshost.exe";
if (!File.Exists(executablePath))
throw new FileNotFoundException(executablePath);
Configuration cfg = ConfigurationManager.OpenExeConfiguration(executablePath);
cfg.AppSettings.Settings.Add("Testing", "12345");
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(cfg.AppSettings.SectionInformation.Name);
string testing = ConfigurationManager.AppSettings["Testing"];
MessageBox.Show(testing);
当我 运行 在 Visual Studio 2017 中使用相同的代码时,消息框显示空白值。
这是 Visual Studio 2017 中的错误还是代码需要修改?
更新(具体原因):
所以主要原因和接受的答案是我在 VS 2015 中打开了生成 *.vshost.exe 相关文件的解决方案。后来我在 VS 2017 中打开了解决方案,当然,*.vshost.exe 文件不会自动清理,所以仍然存在。
更新 2(对于那些希望能够在两者中使用相似代码的人):
string executablePath = Application.ExecutablePath;
executablePath = Path.GetFileNameWithoutExtension(executablePath);
executablePath = executablePath + ".vshost.exe";
// Check if the *.vshost.exe exists
if (File.Exists(executablePath))
{
try
{
// If deleting throws an exception then the stub is being run by *.vshost.exe while
// debugging which means this is NOT Visual Studio 2017 (*.vshost.exe is no longer used in VS 2017)
File.Delete(executablePath);
// If it deletes then use the regular app path since VS2017 is using that now.
executablePath = Application.ExecutablePath;
}
catch (Exception)
{
executablePath = Application.ExecutablePath;
}
}
else
executablePath = Application.ExecutablePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(executablePath);
cfg.AppSettings.Settings.Add("Testing", "12345");
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(cfg.AppSettings.SectionInformation.Name);
string testing = ConfigurationManager.AppSettings["Testing"];
MessageBox.Show(testing);
调试器托管进程有 been removed in VS2017,因此当您 运行 您的应用程序时,您为 OpenExeConfiguration
方法提供的路径不正确。
相反,将 Application.ExecutablePath
传递给该方法,它应该可以工作。如果您关闭托管进程(项目属性 -> 调试 -> 启用 Visual Studio 托管进程),在 VS 2015 中同样适用。
奇怪的是,您首先使用的是托管进程路径,因为只有当 运行在 Visual Studio.
中的调试器中时,它才会起作用
以下代码,当 运行 在 Visual Studio 2015 年及更早时,会导致消息框显示预期值“12345”。
string executablePath = Application.ExecutablePath;
executablePath = Path.GetFileNameWithoutExtension(executablePath);
executablePath = executablePath + ".vshost.exe";
if (!File.Exists(executablePath))
throw new FileNotFoundException(executablePath);
Configuration cfg = ConfigurationManager.OpenExeConfiguration(executablePath);
cfg.AppSettings.Settings.Add("Testing", "12345");
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(cfg.AppSettings.SectionInformation.Name);
string testing = ConfigurationManager.AppSettings["Testing"];
MessageBox.Show(testing);
当我 运行 在 Visual Studio 2017 中使用相同的代码时,消息框显示空白值。
这是 Visual Studio 2017 中的错误还是代码需要修改?
更新(具体原因):
所以主要原因和接受的答案是我在 VS 2015 中打开了生成 *.vshost.exe 相关文件的解决方案。后来我在 VS 2017 中打开了解决方案,当然,*.vshost.exe 文件不会自动清理,所以仍然存在。
更新 2(对于那些希望能够在两者中使用相似代码的人):
string executablePath = Application.ExecutablePath;
executablePath = Path.GetFileNameWithoutExtension(executablePath);
executablePath = executablePath + ".vshost.exe";
// Check if the *.vshost.exe exists
if (File.Exists(executablePath))
{
try
{
// If deleting throws an exception then the stub is being run by *.vshost.exe while
// debugging which means this is NOT Visual Studio 2017 (*.vshost.exe is no longer used in VS 2017)
File.Delete(executablePath);
// If it deletes then use the regular app path since VS2017 is using that now.
executablePath = Application.ExecutablePath;
}
catch (Exception)
{
executablePath = Application.ExecutablePath;
}
}
else
executablePath = Application.ExecutablePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(executablePath);
cfg.AppSettings.Settings.Add("Testing", "12345");
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(cfg.AppSettings.SectionInformation.Name);
string testing = ConfigurationManager.AppSettings["Testing"];
MessageBox.Show(testing);
调试器托管进程有 been removed in VS2017,因此当您 运行 您的应用程序时,您为 OpenExeConfiguration
方法提供的路径不正确。
相反,将 Application.ExecutablePath
传递给该方法,它应该可以工作。如果您关闭托管进程(项目属性 -> 调试 -> 启用 Visual Studio 托管进程),在 VS 2015 中同样适用。
奇怪的是,您首先使用的是托管进程路径,因为只有当 运行在 Visual Studio.
中的调试器中时,它才会起作用