【问题标题】:Location of app.config file used by referenced library for My.Settings?My.Settings 的引用库使用的 app.config 文件的位置?
【发布时间】:2013-06-20 19:28:03
【问题描述】:

如果我有一个带有 app.config 文件的类库(我知道这并不理想,请稍等片刻),其中包含使用项目设置选项卡创建的设置值,并按如下方式访问:

Public Shared Function GetMySetting(key As String) As String
    Dim value As String = My.Settings.Item(key)
    If value = String.Empty Then value = "Setting " & key & " not found."
    Return value
End Function

然后我从这样的应用程序中检索设置:

sb.AppendLine("GetMySetting: " & Library.Settings.GetMySetting("SettingC"))

库项目的 app.config 文件中的设置肯定不会复制到应用程序的 app.config 文件中,但我仍然可以从库 app.config 中检索 My.Settings

所以我在库中添加了一个GetConfigFileName 函数:

Public Shared Function GetConfigFileName() As String
    Return AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
End Function

并在应用程序中检索它:

sb.AppendLine("Library Config File: " & Library.Settings.GetConfigFileName)

但这会返回应用程序的配置文件。

我如何确定库在调用 My.Settings... 时从哪个 .config 文件中读取?

或者它们是否被编译到 DLL 中?

【问题讨论】:

  • 默认设置可能已编译到 DLL 中 - 我怀疑它会在隐藏的设计器文件中。配置设置应覆盖此默认设置。
  • 有点奇怪,我原以为在使用 My.Settings 时无法从库中检索设置
  • 您在使用 Visual Studio 吗?如果您全局找到设置键名称(按名称) - 您可能会找到基于代码的版本 - 它可能会被称为 Global.System.Configuration.DefaultSettingValueAttribute
  • Settings.Designer.vb文件中有这样一个属性,但是它所在的类(MySettings)继承自ApplicationSettingsBase,必须包含文件处理代码(如果有的话)

标签: vb.net visual-studio app-config


【解决方案1】:

阅读cmets后编辑。

我想我看到了你的追求。 My.Settings 将使用类库设置中的编译值作为默认值。我相信这些都是编译进去的。你可以反映源代码,看看它是否在它们上设置了 defaultvalue 属性。

您可以通过在主 exe 的应用程序文件中设置值来覆盖这些。如果设置不在 exes 文件中,那么您将使用您在类库中指定的默认设置。

您不应该关心文件名。假设设置是默认设置或被覆盖。如果您需要知道它们是否被覆盖,那是另一个问题。

【讨论】:

  • 你误会了情况,重读这一行:库项目的app.config文件中的设置肯定没有复制到应用程序的app.config文件中,但我仍然可以检索到来自库 app.config 的 My.Settings。
【解决方案2】:

但这会返回应用程序的配置文件。我怎样才能确定 库在调用时从哪个 .config 文件中读取 我的设置...?

  • 默认情况下,它将始终为main.exe.config

    看看这个以获得详细的答案 C# DLL config file 为 更多信息

  • 您可以使用外部配置文件。 This article 在 MSDN 上 解释如何。

编辑

你误解了情况,重读这一行:设置 从库项目的app.config文件中肯定不是 复制到应用程序的 app.config 文件中,但我可以从库 app.config 中检索 My.Settings。

你是对的。您在 dll.config 中的设置不会自动复制到 app.config 中。

关于你能从你的dll中获得的价值,我还在寻找更官方的答案,但答案似乎是:

“旧”值(您在开发时定义的值)是硬编码的。如果 franework 无法访问或打开它将使用默认值的配置文件 反而。如果您在 dll 中使用设置,这种情况总是会发生。

看看这个Settings.Default.<property> always returns default value instead of value in persistant storage (XML file)

【讨论】:

  • 你误会了情况,重读这一行:库项目的app.config文件中的设置肯定没有复制到应用程序的app.config文件中,但我仍然可以检索到来自库 app.config 的 My.Settings。
  • 很好地发现,这强化了我的新经验法则:“不要使用 My.Settings”。从现在开始,我将坚持使用 ConfigurationManager.Appsettings
猜你喜欢
  • 2014-08-07
  • 2013-11-02
  • 2018-12-11
  • 2013-07-06
  • 1970-01-01
  • 2012-10-26
  • 2011-04-03
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多