2009-02-07 88 views
6

我有一個具有Installer類的Visual Studio安裝項目。在安裝I類設置的設置如下:如何在安裝時設置應用程序設置(通過安裝程序類)

 MessageBox.Show(Properties.Settings.Default.MySetting); 

     Properties.Settings.Default.MySetting = "Foo"; 
     Properties.Settings.Default.Save(); 

     MessageBox.Show(Properties.Settings.Default.MySetting); 

的問題是,即使我知道,正在執行代碼(我做其他的東西),設置從未設置!

消息框確實表明正在設置該值,但是當我轉到.config文件時,該值仍然爲空!

任何人有任何想法爲什麼和/或可能的解決方法?

回答

4

我爲我的安裝程序做的是使用App.Config中的「file」屬性。該塊的appSettings需要一個「文件」屬性,就像這樣:

<appSettings file="user.config"> 
    <add key="foo" value="some value unchanged by setup"/> 
</appSettings> 

「文件」屬性是有點像CSS,在最具體的設置獲勝。如果您在user.config中定義了「foo」以及App.config,則會使用user.config中的值。

然後,我有一個配置生成器,它使用字典中的值將第二個appSettings塊寫出到user.config(或任何你想要調用它的)。

using System.Collections.Generic; 
using System.Text; 
using System.Xml; 

namespace Utils 
{ 
    public class ConfigGenerator 
    { 
     public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration) 
     { 
      using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8)) 
      { 
       xw.Formatting = Formatting.Indented; 
       xw.Indentation = 4; 
       xw.WriteStartDocument(); 
       xw.WriteStartElement("appSettings"); 

       foreach (KeyValuePair<string, string> pair in userConfiguration) 
       { 
        xw.WriteStartElement("add"); 
        xw.WriteAttributeString("key", pair.Key); 
        xw.WriteAttributeString("value", pair.Value); 
        xw.WriteEndElement(); 
       } 

       xw.WriteEndElement(); 
       xw.WriteEndDocument(); 
      } 
     } 
    } 
} 

在你安裝程序,只需添加的東西就像在你安裝方法如下:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar); 

IDictionary<string, string> userConfiguration = new Dictionary<string, string>(); 

userConfiguration["Server"] = Context.Parameters["Server"]; 
userConfiguration["Port"] = Context.Parameters["Port"]; 

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 

我們用它來我們的測試,培訓和生產服務器,所以我們要做的就是指定安裝過程中的機器名稱和密碼,以及我們所關心的一切。它曾經是一個3小時的過程,包括通過多個配置文件來設置密碼。現在它幾乎完全自動化。

希望這會有所幫助。

+0

謝謝你,它看起來像我以後的解決方案。雖然我遇到了問題,但如果我在安裝程序中重寫Install方法,則自定義UI中的值不在上下文參數中。我使用正確的方法嗎?乾杯 – MrEdmundo 2009-12-04 10:26:08

0

我真的不知道這是否在安裝過程中支持 - 但如果是這樣,請確保您撥打Save()Settings.Default

+0

我已經設置了保存設置,但是儘管如此,值並沒有真正設置! – Calanus 2009-02-07 12:09:30

0

那麼最終我放棄了,並有一個RunOnce類型的方法來完成這個東西后,安裝應用程序。

0

簡而言之,它在安裝程序類中不受支持。您只需要瞭解安裝程序類的方法是從系統目錄運行的msiexec.exe中調用的,並且該環境不可能知道您在某個目錄中的某個設置文件中完全沒有意識到該設置文件。這就是爲什麼它能夠與明確進入文件安裝位置並在那裏更新的代碼一起工作。

相關問題