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.

中的调试器中时,它才会起作用