无法检索应用程序设置值

unable to retrieve appsettings value

我在检索应用程序设置时做错了什么?

在我的 app.config 我有:

...
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
  <appSettings>
    <add key="culture" value="cs-CZ"/>
  </appSettings>
</configuration>

我正在尝试检索 culture 值:

Dim culture = ConfigurationManager.AppSettings("culture").ToString()

但是culture总是屈服Nothing

我在检索应用程序设置时做错了什么?

这是我的整个 app.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <globalization uiculture="cs-CZ" culture="cs-CZ">
  </globalization>
  <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="WindowsApplication1.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
        </sectionGroup>
    </configSections>

    <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLog"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information"/>
        </switches>
        <sharedListeners>
            <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
    <userSettings>
        <WindowsApplication1.My.MySettings>
            <setting name="txtPatientName" serializeAs="String">
                <value>Patient Name</value>
            </setting>
            <setting name="datastorage" serializeAs="String">
                <value/>
            </setting>
        </WindowsApplication1.My.MySettings>
    </userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
  <appSettings>
    <add key="culture" value="cs-CZ"/>
  </appSettings>
</configuration>

你的代码没有错。由于 ConfigurationManager.AppSettings("some-key") 总是 returns 现有 属性 的字符串,因此您永远不需要 .ToString() 调用。

它产生 Nothing 的事实意味着它不存在。由于密钥似乎匹配,很可能你的 app.config 不在正确的位置。

您确定它在生成您的 .exe 的项目中吗?

编辑:

老实说,没有明显的问题。我必须查看您项目的 .vbproj xml 才能确定。我什至通过创建一个新的空 VB 项目和 copy-pasted 你的 app.config 来仔细检查我的。

这是项目的全部代码:

Module Module1
    Sub Main()
        Dim culture = Configuration.ConfigurationManager.AppSettings("culture")
        Console.WriteLine(culture)
        Console.ReadKey()
    End Sub
End Module

它抱怨 globalization 部分未知,所以我删除了该部分并留下其余部分 as-is。

控制台应用程序输出符合预期:cs-CZ

您可以尝试删除该部分,看看会发生什么,但我怀疑那是罪魁祸首。否则您的应用不会 运行。

继续.vbproj XML:

Visual Studio 有一种添加配置的特定方法。当您通过简单的 copy-paste.

手动添加此类文件时,它通常不起作用 out-of-the-box

这是您创建项目时新添加到项目中的app.config,还是手动添加/copy-paste?

你可以验证一下:

  1. Right-click 你的项目。按 Unload Project

  2. Right-click 您的项目,按 Edit [projectname].vbproj。您现在正在查看定义项目 structure/settings 等的 XML 文件

  3. 找到棋子 <None Include="App.config" /> 并确认它与其他两个节点一起位于 ItemGroup 节点下,它应该大致如下所示:

     <ItemGroup>
       <None Include="My Project\Application.myapp">
         <Generator>MyApplicationCodeGenerator</Generator>
         <LastGenOutput>Application.Designer.vb</LastGenOutput>
       </None>
       <None Include="My Project\Settings.settings">
         <Generator>SettingsSingleFileGenerator</Generator>
         <CustomToolNamespace>My</CustomToolNamespace>
         <LastGenOutput>Settings.Designer.vb</LastGenOutput>
       </None>
       <None Include="App.config" />
     </ItemGroup>
    

同样,我认为这不是问题,因为您说过 application.exe.config 已正确生成到输出中。不过,消除这种可能性并没有坏处。

最后,一个范围问题:

.NET 的配置系统是 multi-inheritance 从 MACHINE.config 开始一直到你的 app.config(中间有一层或两层 web/user 上下文视情况而定)。

我不知道除了你给我看的细节之外的细节,所以从技术上讲,你的计算机/用户配置文件/visual studio 等上的某些设置可能会使配置层次结构加载不同。也许您只是获得了更高级别的配置。

您可以 "force" 使用一些稍微复杂的代码。我不会称之为解决方案,但如果这确实有效,至少它可以缩小问题范围:

Imports System.Configuration
Module Module1
    Sub Main()
        Dim config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
        Dim culture = config.AppSettings.Settings("culture").Value 'Note you do need the .Value here; this is a different kind of config object
        Console.WriteLine(culture)
        Console.ReadKey()
    End Sub
End Module