2009-02-07 11 views
6

Mam projekt instalacji programu Visual Studio, który ma klasę Instalatora. W klasie instalatora ustawić ustawienia w następujący sposób:Jak ustawić ustawienia aplikacji w czasie instalacji (przez klasę instalatora)?

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

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

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

Problemem jest to, że choć wiem, że ten kod jest wykonywany (robię inne rzeczy), ustawienie nie jest ustawiony !!

Pola komunikatów sugerują, że wartość jest ustawiana, ale kiedy przejdę do pliku .config, wartość jest nadal pusta!

Ktoś ma jakieś pomysły, dlaczego i/lub możliwe obejście problemu?

Odpowiedz

4

Co robię dla moich instalatorów to użycie atrybutu "file" w App.Config. Blok appSettings wykonuje „plik” atrybut tak:

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

„Akta” atrybut jest coś jak CSS, w tym najbardziej specyficznych zwycięstw ustawień. Jeśli masz zdefiniowane "foo" w pliku user.config oraz App.config, używana jest wartość w pliku user.config.

Następnie mam generator konfiguracji, który wypisuje drugi blok aplikacji do pliku user.config (lub cokolwiek chcesz go nazwać), używając wartości w słowniku.

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(); 
      } 
     } 
    } 
} 

W instalatora, wystarczy dodać coś jak poniżej w Install metody:

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); 

Używamy go do naszych testów, szkoleń i serwerów produkcyjnych, więc wszystko, co musimy zrobić, to określić nazwa maszyny i hasło podczas instalacji, a wszystko załatwione dla nas. Był to proces trwający 3 godziny, obejmujący przechodzenie przez wiele plików konfiguracyjnych w celu ustawienia haseł. Teraz jest prawie całkowicie zautomatyzowany.

Mam nadzieję, że to pomoże.

+0

Dziękuję za to, wygląda to na rodzaj rozwiązania, którego szukam. Chociaż mam problem, jeśli nadpisuję metodę instalacji w moim instalatorze, wartości z niestandardowego interfejsu użytkownika nie znajdują się w parametrach kontekstu. Czy używam właściwej metody? Pozdrowienia – MrEdmundo

+0

Zignoruj ​​to, nie przekazałem danych z interfejsu użytkownika na ekranie edycji CustomActions. – MrEdmundo

0

Szczerze mówiąc nie wiem, czy jest to obsługiwane podczas instalacji - ale jeśli tak, upewnij się, że dzwonisz pod numer Save() pod numerem Settings.Default.

+0

Ustawiłem ustawienie Save, ale mimo to wartość ta nie jest ustawiona! – Calanus

0

Koniec końców, poddałem się i miałem metodę typu RunOnce, aby zrobić to po zainstalowaniu aplikacji.

0

Krótka odpowiedź brzmi, że nie jest obsługiwana w klasach instalatora. Musisz tylko zrozumieć, że metody klasy instalatora są wywoływane z msiexec.exe uruchomionego z katalogu systemowego, a to środowisko nie może wiedzieć, że masz plik ustawień gdzieś w katalogu, którego kompletnie nie zna. Dlatego działa z kodem, który jawnie trafia do zainstalowanej lokalizacji pliku i aktualizuje go tam.

Powiązane problemy