2013-12-12 50 views
0

我使用app.config來存儲一些信息。我的文件是這樣的:嘗試在app.config中寫入時出現NullReferenceException

<?xml version="1.0"?> 
<configuration> 
<appSettings> 
<add key="używajDomyślnie" value="false" /> 
<add key="sInicjały" value="ŁM" /> 
<add key="nPrzedstawiciel" value="Łukasz Motyczka" /> 
<add key="nPozycja" value="Przedstawiciel Naukowo-Handlowy" /> 
<add key="nTelefon" value="+48 784 567 670" /> 
<add key="nEmail" value="[email protected]" /> 
<add key="dataoferty" value="" /> 
<add key="ostatniNrOferty" value="" /> 

</appSettings> 
<connectionStrings> 
<add name="Oferty_BMGRP.Properties.Settings.BazaDanychConnectionString" connectionString="Data Source=|DataDirectory|\BazaDanych.sdf" providerName="Microsoft.SqlServerCe.Client.3.5" /> 
    </connectionStrings> 
    <system.windows.forms jitDebugging = "true"/> 
</configuration> 

拋出一個NullexceptionError是該片段:

if(checkBox1.CheckState == CheckState.Checked) 
    { 

     Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     AppSettingsSection app = config.AppSettings; 

     //app.Settings.Clear(); 
     //app.Settings.Add("używajDomyślnie", "true"); 
     //app.Settings.Add("sInicjały", sInicjaly.ToString()); 
     //app.Settings.Add("nPrzedstawiciel", nPrzedstawiciel.ToString()); 
     //app.Settings.Add("nPozycja", nPozycja.ToString()); 
     //app.Settings.Add("nTelefon", nTelefon.ToString()); 
     //app.Settings.Add("nEmail", nEmail.ToString()); 

     config.AppSettings.Settings["używajDomyślnie"].Value = "true"; //<- THIS LINE GIVES ME AN ERROR 
     config.AppSettings.Settings["sInicjały"].Value = sInicjaly.ToString(); 
     config.AppSettings.Settings["nPrzedstawiciel"].Value = nPrzedstawiciel.ToString(); 
     config.AppSettings.Settings["nPozycja"].Value = nPozycja.ToString(); 
     config.AppSettings.Settings["nTelefon"].Value = nTelefon.ToString(); 
     config.AppSettings.Settings["nEmail"].Value = nEmail.ToString(); 

     config.Save(ConfigurationSaveMode.Modified); 

     form1.checkBox1.CheckState = CheckState.Checked; 

    }  

當我調試它或建立VS釋放它工作正常。它也適用於我的筆記本電腦。但在其他機器上,我有空異常錯誤。也一直工作,直到我試圖做一個安裝項目(這工作,但喜歡這一個)。 jit調試不起作用,我仍然有一個.net錯誤(繼續或退出)。

而且我也注意到,我的電腦,我用一些其他的筆記本電腦,在發生錯誤時它顯示:

System.NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu. 
    w Oferty_BMGRP.Form3.button1_Click(Object sender, EventArgs e) w C:\Users\user\Documents\Visual Studio 2010\Projects\BMGRP\Oferty BMGRP\OfertyBMGRP\Form3.cs:wiersz 282 

對不起,波蘭語,但我想指出的是,在兩臺機器上就說明路徑到相同的文件夾,它只存在於其中一個文件夾中。

請幫忙:)

編輯!

我剛剛發現,如果我構建版本。運行應用程序並運行上述代碼,它會創建MyApplication.exe.config文件,然後應用程序在每臺計算機上都能正常工作。我怎樣才能使它作爲安裝項目工作,其中.exe.config沒有創建,只有app.config?

+1

嘗試'config.AppSettings.Add'而不是可能?在你甚至有機會設置一個值之前,索引器('Settings [「blah」]')在這裏返回null。 –

+0

我討厭回答如此明顯......是的,它通過這種方式創建.exe.config文件。 :0必須重做我的代碼,因爲這樣它會添加這些行,每次應用程序運行到結束......謝謝 –

+0

@JohnGibb請張貼它作爲答案,所以我將能夠接受它:) –

回答

2

您正試圖設置空對象的Value屬性。在您甚至有機會設置該值之前,Settings["blah"]將返回null。

試試這個:

config.AppSettings.Add("key", "value"); 

或許將空校驗:

if(config.AppSettings.Settings["key"] == null) 
{ 
    config.AppSettings.Add("key", "value"); 
} 
+0

我驚訝地發現,我只從我的代碼中刪除了//並且它可以工作。它不會在.config文件中添加多行。工作得很好......現在:) –

+0

這修正了錯誤,但現在它甚至不改變文件中的任何東西。 –

+0

實際上,改變保存類型可以修改書寫,但現在它只是增加了第二個值,即如果該值爲「false」,它現在說「false,true」而不是「true」。 –

1

MyApplication.exe.configapp.config,你不應該混淆這種範式。這就是.net應用程序的工作原理。

如果您希望以不同於此的方式進行配置,則可以執行自己的文件IO或查找另一個外部配置庫。

+0

嗯,我的發佈文件夾中有兩個文件。 MyApplication.exe.config和app.config。我明白他們基本上是同一個文件。但它仍然不能回答我的問題。爲什麼我在VS中運行該程序並創建.exe.config之前,會收到nullreferenceexception? app.config文件已經存在。其他計算機上的應用程序在第一次運行時不會創建.exe.config。 –

+0

@ŁukaszMotyczka做了框架添加'應用程序。配置「到你的輸出目錄?還是你自己做那部分? –

+1

@ŁukaszMotyczka你正在尋找'MyApplication.exe.config'的程序不是在尋找'app.config'。就你的程序而言,'app.config'甚至不存在。 –

相關問題