解决方案中的 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- 中进行了测试少量。我怀疑它们在所有版本中都是正确的。
我正在使用 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- 中进行了测试少量。我怀疑它们在所有版本中都是正确的。