解决方案中的WinForms.Net子应用程序如何将其app.config嵌入自身?

解决方案中的WinForms.Net子应用程序如何将其app.config嵌入自身?,winforms,app-config,configurationmanager,Winforms,App Config,Configurationmanager,当应用程序中存在未处理的异常时,我将使用it步骤的变体。然后记录错误,生成屏幕截图并通知用户 在解决方案中编译时,项目将生成一个EXE,在需要时调用该EXE。在更新程序时,我使用Visual Studio 13编辑项目属性中的现有设置项。在代码中,我使用来自ConfigurationManager的命令 string appProduct = unhandledExceptions.Properties.Settings.Default.AppProduct; 我很高兴看到它工作了,并且反映了

当应用程序中存在未处理的异常时,我将使用it步骤的变体。然后记录错误,生成屏幕截图并通知用户

在解决方案中编译时,项目将生成一个EXE,在需要时调用该EXE。在更新程序时,我使用Visual Studio 13编辑项目属性中的现有设置项。在代码中,我使用来自
ConfigurationManager
的命令

string appProduct = unhandledExceptions.Properties.Settings.Default.AppProduct;
我很高兴看到它工作了,并且反映了我在IDE中所做的更改。但是,我在解决方案生成的confg文件(
MyApplication.exe.config
)中找不到设置。我假设它正在返回到另一个项目文件夹,用于
UnhandledExceptions.exe.config

我创建了一个安装程序并将其安装到虚拟机上。我的设置保留了下来,但我还是看不到配置文件

结果表明,这些值嵌入了可执行文件
UnhandledException.exe

项目没有列出任何资源。在网上搜索并寻找一个想要这样做的问题,而且有很多问题,看起来这通常被认为是不可能的,也是不可取的。问题通常以“你不想这么做,这叫配置是有原因的”

我可能想关闭此选项,因此它在外部是可编辑的。两个项目中app.config的属性相同

到底是什么样的环境使这成为可能?这是Visual Studio 2013的新功能吗?

不需要Visual Studio设置。如果您不希望用户访问配置文件,请不要将其包含在分发版中。如果已知设置名称,则始终可以添加一个

在下面的描述中,应用程序通常表示正在使用的应用程序的名称

通过观察,我发现了有关ConfigurationManager工作方式的一些有趣的事情。 对于用户设置,它将按优先级顺序查看以下位置:

  • 用户的AppData区域中应用程序的user.config

  • 程序文件夹中的application.exe.config

  • application.exe本身

将分别搜索每个设置。如果应用程序请求的设置在user.config或application.exe.config中都找不到,它将从可执行文件中获取该设置

对于应用程序设置,按优先级顺序在以下位置查找:

  • 程序文件夹中的application.exe.config

  • application.exe本身

应用程序设置没有与user.config等效的设置

在Visual Studio IDE中打开application.exe不会显示配置信息的资源

application.exe.config很方便,因为它可以在外部修改并用作新安装的默认值。一旦在user.config中覆盖设置,application.exe.config中的值将被忽略

对于AppSettings部分来说,情况并非如此,后者是.Net 1.0中较旧的配置方法。如果我删除了配置文件,那么可执行文件中就没有这些文件


这些观察是使用Visual Studio 2013 Update 4进行的,并在64位Windows 7 Professional中进行了测试。我怀疑它们在所有版本中都是正确的。

类库项目不能有functional.config文件。仅使用EXE项目的.config文件。您的代码仍然有效,因为它只是使用默认值,如项目的Settings.Designer.cs文件中记录的那样。也就是说,用户没有理由更改产品名称:)您应该自己将类库的配置项合并到EXE项目的配置文件中。它不是自动的,也不是很实用。@HansPassant我可以在代码中更改用户值。对保存的值所做的更改,写入用户文件夹的AppData应用程序部分中的“user.config”的本地副本,就像主应用程序一样。它确实会在该文件中创建一个单独的部分,将其与主应用程序的更新值分开。