如何在C#项目中嵌入app.config文件?

18
当您编译一个 C# 项目时,app.config 中的应用程序设置会保存在 exe 文件中。例如,如果程序名称为“solve_np.exe”,则会在其旁边有一个“solve_np.exe.config”文件,使它看起来不够整洁。如何将其嵌入到 .exe 文件中呢?
我尝试将 Build Action 设置为 Embed Resource,但没有起作用。
6个回答

11
啊哈,我猜你可能会遇到Visual Studio自动安排用户不需要配置的问题。
在这种情况下,你可以使用资源文件。只需添加一个新的.resx类型的文件即可。通过这个文件,你可以添加诸如字符串和图像等资源。在构建后,它应该提供对资源的静态访问(通常会为你生成一个代码文件,因此你无需自己访问ResourceManager)。
例如,如果我创建了一个名为resources.resx的资源文件,并在其中添加了一个名为MyConfigValue的字符串,在构建后,我就可以像这样访问它:
textBox.Text = Resources.MyConfigValue;

如果您需要有点可变但不应该是可配置的值,那么将它们放在这里是正确的位置。

希望对你有所帮助。


我重新措辞了问题,以免冒犯他人。 - Wamiduku
1
我应该从一开始就写“当用户不需要更改配置时,会显得不那么整洁”,而不是“不专业”。对于我的表述不够清晰,我深感抱歉。.config 文件中的数据是由 VS 生成的。总的来说,aaronls 描述了我想要表达的内容。 - Wamiduku
谢谢,我想我会这样做。每当VS将某些内容放入配置中时,我将制作自己的版本作为资源,并将引用从配置重定向到资源。 - Wamiduku
这对于配置文件为基础的库不起作用。我猜这是库的限制,如果它们依赖于它,但嵌入文件的透明方式会很好。 - Didier A.
1
我在“config”文件中存储的唯一数据是它不应该在.NET 4.0上运行,因为至少需要4.5.2。微软故意使得很难告诉你实际运行的版本,从而使解决方案变得相当困难。我相信其他想要嵌入他们的app.config的人也面临着类似的烦恼,并且有非常好的理由来嵌入它。 - Roman Starkov
显示剩余2条评论

7

在exe文件旁边放置app.config文件并不不专业。我认为你可能想要的词是凌乱。个人而言,我并不这样认为,但每个人都不同!也许你可以默认将app.config文件隐藏起来?

或者另一种选择是创建自己的配置文件,可以将其保存到App Data文件夹中,甚至可以将设置存储在注册表中。


1
+1 给出注册表作为一个选项,这真正回答了 OP 的问题(虽然我并不是很喜欢这个选项)。 - Sorin Comanescu
4
在 .Net 中,有一些默认情况下在 app.config 中配置的内容,但你不需要让用户更改它。例如,企业库加密密钥和算法等内容。如果能选择将其嵌入到可执行文件中会很好,因为用户很容易丢失 app.config 文件并破坏可执行文件。 - Didier A.

4

还有一个需要考虑的因素。经验丰富的 .Net 开发人员习惯于标准应用程序设计,包括在 Web 应用程序和桌面应用程序中使用配置文件。如果您偏离这种实践,将使任何跟随您的开发人员更难理解您所做的事情。即使是 Web 服务器上的 sa 也可能会因缺少配置文件而感到困惑。

由于几乎每个人都是按照这种方式做的,因此您的代码不会被别人看作“杂乱无章”。相反,如果预期存在配置文件却找不到,则会让人感到困惑。


2
通常情况下,配置文件的理论是存储在应用程序部署后(例如用户偏好设置)可能需要更改的设置。为此,您需要将其存储在应用程序外部的某个地方。如果使用默认设置,则会得到“[Your].exe.config”文件。您可以查看许多其他选项,但几乎每个选项都会在某个地方写入文件,如果您提供保存某种设置的机制。

0

我同意serhio darasd和Quibblesome的观点,但你可以直接删除“solve_np.exe.config”文件,这样它就会使用默认配置。


0
在考虑这些评论和其他搜索结果后,我决定处理我的问题——希望将Entity Framework连接字符串嵌入到可执行文件中,而不需要MyApplication.exe.config文件与我的部署解决方案一起使用的最佳方法是创建一个派生类,如下所示:

Public Class MyEFDataContainerLocal
   Inherits MyEFDataContainer

    Public Sub New()
        MyBase.New(My.Settings.MyEFContainerConnectionString)
    End Sub
End Class

我刚刚创建了一个连接字符串类型的应用程序设置,其中包含与App.Config文件中相同的字符串。 我只需要将&quote;替换为实际引号即可。

然后,每当我想要使用MyEFDataContainer时,例如Dim db As New MyEFDataContainer,我只需使用Dim db As New MyEFDataContainerLocal代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接