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

How does a WinForms .Net sub-application in a solution embed its app.config into itself?

我正在使用 Jeff Atwood’s Unhandled Exception handler 的变体,它会在应用程序中出现未处理的异常时介入。然后它会记录错误、生成屏幕截图并通知用户。

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

的命令
string appProduct = unhandledExceptions.Properties.Settings.Default.AppProduct;

我很高兴看到它起作用并反映了我在 IDE 中所做的更改。但是我在解决方案生成的 confg 文件 (MyApplication.exe.config) 中找不到设置。我假设它返回到 UnhandledExceptions.exe.config 的另一个项目文件夹。

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

事实证明这些值嵌入在可执行文件中 UnhandledException.exe

该项目没有列出任何资源。搜索网络和 Whosebug 寻找想要这样做的问题,并且有很多,似乎这通常被认为是不可能的,也是不可取的。问题通常以 “你不想这样做,它被称为配置是有原因的”结束。

我可能想关闭它,这样它就可以在外部进行编辑。 app.config 在两个项目中的属性是相同的。

到底是什么设置使这成为可能?它是 Visual Studio 2013 的新功能吗?

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

在下面的描述中application一般表示正在使用的应用程序的名称。

我通过观察发现了一些关于 ConfigurationManager 工作方式的有趣之处。 对于 User 设置,它将按优先顺序查找以下位置:

  • user.config为应用在用户的AppData

  • application.exe.config在程序文件夹

  • application.exe本身

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

对于 Application 设置,它按优先顺序在以下位置查找:

  • application.exe.config在程序文件夹

  • application.exe本身。

没有等同于 user.config 的应用程序设置。

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

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

AppSettings部分也不一样,旧的配置方法来自.Net 1.0。如果我删除配置文件,它不会在可执行文件中包含它们。

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