I am working on a project that requires me to modify the .config file for a Windows service (written in ASP.NET) I wrote. The changes need to be made from an administrative website I am developing. When the user selects the 'UPDATE' button on the web app, the code below is executed:
Protected Sub ModifyAppConfig()
Try
Dim configFile = "C:\App\App.exe.config"
Dim configFileMap As New ExeConfigurationFileMap
configFileMap.ExeConfigFilename = configFile
Dim config As System.Configuration.Configuration
config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None)
config.AppSettings.Settings("LogDirectory").Value = txtLogDirectory.Text '* EXCEPTION IS THROWN HERE *
config.Save()
Catch ex As Exception
End Try
End Sub
When the application is trying to access "LogDirectory" AppSettings index, an exception is thrown. Object reference not set to an instance of an object.
During debugging, the AppSettings.Count = 0
. How come none of the AppSettings are imported?
I know that it is correctly opening the file because there are ConnectionString data. Below is the config File:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<appSettings>
<add key="LogDirectory" value="C:\CTemp\"/>
</appSettings>
</configuration>
How can I access and modify the AppSettings("LogDirectory") value?
Frankly, I don't see anything wrong with your program.
I've created a VB.Net/Console mode MCVE that might help your troubleshooting
Module1.vb
Imports System.Configuration
'
' EXAMPLE OUTPUT:
' Reading config file(test.exe.config)...
' config.AppSettings.Settings("LogDirectory") : C : \CTemp\
' connectionStrings: <connectionStrings>
' <add name = "conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;
' Integrated Security=True" providerName="System.Data.SqlClient"/>
' </connectionStrings>
' appSettings: <appSettings>
' <add key = "LogDirectory" value="C:\CTemp\"/>
' </appSettings>
' startup: <startup>
' <supportedRuntime version = "v4.0" sku=".NETFramework,Version=v4.5"/>
' </startup>
' 3 sections were found.
'
Module Module1
Sub Main()
' Get filename
Dim args() As String = System.Environment.GetCommandLineArgs()
If args.Length <> 2 Then
Console.WriteLine("USAGE: ReadAppConfig <\path\to\app.config>")
Return
End If
Dim configFilePath As String = args(1)
' Open config file
Try
Console.WriteLine("Reading config file(" & configFilePath & ")...")
Dim configFileMap As New ExeConfigurationFileMap
configFileMap.ExeConfigFilename = configFilePath
Dim config As System.Configuration.Configuration
config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None)
' Try to read AppSettings["LogDirectory"]
Dim obj = config.AppSettings.Settings("LogDirectory")
If IsNothing(obj) Then
Console.WriteLine("config.AppSettings.Settings(""LogDirectory""): NULL")
Else
Console.WriteLine("config.AppSettings.Settings(""LogDirectory""): " & obj.Value)
End If
' Dump all Sections
Dim ct As Integer = 0
For Each section As ConfigurationSection In config.Sections
Dim xml = section.SectionInformation.GetRawXml
If Not xml = Nothing Then
Console.WriteLine(section.SectionInformation.Name & ": " & xml)
ct = ct + 1
End If
Next
Console.WriteLine(ct & " sections were found.")
Catch ex As Exception
System.Console.WriteLine("ERROR: " & ex.Message)
End Try
End Sub
End Module
test.exe.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<appSettings>
<add key="LogDirectory" value="C:\CTemp\"/>
</appSettings>
</configuration>
'Hope that helps...