为啥 .net 配置设置被编译成程序集?

Posted

技术标签:

【中文标题】为啥 .net 配置设置被编译成程序集?【英文标题】:Why are .net configuration settings compiled into assemblies?为什么 .net 配置设置被编译成程序集? 【发布时间】:2010-10-05 16:03:15 【问题描述】:

我一直在尝试了解如何在 .net 中正确进行配置,但遇到了一些我觉得有点奇怪的事情,那就是配置设置通过 Settings 类编译到程序集中。删除 app.config 并运行应用程序不会像我预期的那样导致配置错误,而是现在我无法替换配置值。

在我的应用程序中,我有一个 web 服务 url 的配置设置,我需要能够以编程方式获取和设置。我是否应该在我的应用程序的配置中创建自定义部分,我将通过 ConfigurationManager.GetSection(..) 来触发读取配置文件,或者是否有其他方法可以解决这个问题,因为我绝对不想要 web 服务 url用于将 ws 代理生成为可能泄漏到生产环境中的 url。

请帮忙。

【问题讨论】:

【参考方案1】:

看Where are user-mode .NET settings stored?

.NET 设置不在程序集中

【讨论】:

【参考方案2】:

我想我明白你在说什么,乔乔。假设您从 www.productionurl.com 添加了一个 web 服务,生成的代理类将生产 url 保留在源代码中。在运行时,如果在配置文件中找不到 url 的值(前提是您已将服务设置为动态),它将使用此默认值。

如果您不喜欢这种行为,您有 2 个选择:

更改 Reference.cs 文件(您必须在刷新服务代理时继续这样做) 为代理创建部分类并覆盖 URL 设置

或者您可以检查该 Web 服务是否有开发站点。如果是,请从该站点而不是生产站点创建 Web 引用。

【讨论】:

【参考方案3】:

据我所知,webservice 引用逻辑指出,如果 app.config(或 web.config)中有某个键,它将选择...如果没有...它将使用使用的 URL 引用创建 Web 服务引用。在 Framework 1.1 中,可能是 2.0。

至少在 framework 3.0 中的 Settings.settings 文件被用作默认值。如果您没有在 web.config 中提供覆盖 Settings.settings 中的键的键,它将使用默认值...这就是您看不到配置错误的原因。在 Web 服务引用的情况下,该文件中存储了您为创建引用而提供的值。

如我所见... Settings.settings 允许您以编程方式更新密钥,以保存首选项以及一些持久化的方式。

More info:

【讨论】:

【参考方案4】:

据我记得(我有待更正),.Net 创建了一个配置文件,存储在您的 Windows 应用程序数据文件夹中,如果您正在部署应用程序,则尤其如此。

在应用数据(C:\Documents and settings\yourusername\Local Setting\Application Data\your app name)中搜索,看看是否可以在其中找到应用配置。如果可以,您应该可以在那里进行更改.

我也不确定您正在创建什么类型的网络服务,但您不应该使用 web.config(我使用的)来存储设置吗?

【讨论】:

【参考方案5】:

尝试将应用程序配置文件而不是设置文件添加到您的项目中。应用程序配置文件不会编译到程序集中。

【讨论】:

添加 Web 服务引用时,会自动创建设置文件。我该如何反击? 什么样的网络参考?网络服务? WCF?【参考方案6】:

当您添加对 web 服务的引用时,您可以设置属性以使 web 服务 url 动态(即从配置文件中读取)。

点击“网络参考”。单击您的网络服务并将属性“URL 行为”从“静态”设置为“动态”。

一旦您做出更改,您只需在应用运行前更改配置文件即可将 Web 服务指向正确的 URL。

【讨论】:

我所有的 web 服务引用都设置为 URL Behavior=Dynamic ,它工作正常。这仍然不能解决最初提出的问题。如果我在构建初始 url 后删除配置文件,仍然会从编译到程序集中的设置中获取。 限制您的开发 Web 服务的 IP 地址范围,以便只有您的开发机器可以与其通信。然后,如果在安装应用程序后删除了配置文件,则至少该应用程序在尝试连接到它时会失败。我知道的唯一其他方法是手动生成代理并进行修改。 d 设置类从 d 应用的配置文件中读取。这只是一种强输入应用程序配置值的新方法(在 .Net 2.0 中)。但是,要解决您的问题,请查看 Reference.cs 文件 4 您的 Web 服务并更改默认 URL。每当您刷新服务时,您都必须继续这样做。【参考方案7】:

如果你点击属性上的加号,然后点击设置,你会发现一个名为 settings.designer.cs 的文件

此文件包含您在定义应用程序设置时创建的默认值,这就是您的应用程序在没有配置文件的情况下工作的原因。

但是,您始终可以覆盖此值。

您对此进行测试的唯一方法是创建一个可供公众安全使用的默认值,并在测试期间更改它。

【讨论】:

在我的情况下,网络服务 url “安全”对于公众消费没有任何价值。我有 dev、stage、prod webservices,因此如果未在配置文件中设置,我希望应用程序抛出 configurationerrorsexception 而不是使用我用来创建代理的 dev ws url。

以上是关于为啥 .net 配置设置被编译成程序集?的主要内容,如果未能解决你的问题,请参考以下文章

如果我已经创建了一个序列化程序集,为啥代码会编译一个序列化程序集?

为啥很多ASP.NET网页初次访问很慢,以后几次访问很快

为啥某些 .Net 程序集无法通过 AppDomain 的 GetAssemblies() 方法获得?

未能加载的文件或程序集.怎么解决

关于.NET编译的目标平台(AnyCPU,x86,x64)

[.NET大牛之路 007] 详解 .NET 程序集