无法检索应用程序设置值
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?
你可以验证一下:
Right-click 你的项目。按 Unload Project
Right-click 您的项目,按 Edit [projectname].vbproj
。您现在正在查看定义项目 structure/settings 等的 XML 文件
找到棋子 <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
我在检索应用程序设置时做错了什么?
在我的 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?
你可以验证一下:
Right-click 你的项目。按
Unload Project
Right-click 您的项目,按
Edit [projectname].vbproj
。您现在正在查看定义项目 structure/settings 等的 XML 文件找到棋子
<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