Konfig módosítás telepítőből

Kár szépíteni a dolgot, mindenki utál telepítőt írni az alkalmazásához. A telepítő készítés igen komoly versenyben van a doksi írással, vagy a projekt vezetői teendők közül az erőforrás- és határidő becsléssel, ha azt nézzük, egy átlag fejlesztő mennyire undorodik tőle.

Szerencsére vannak jó források a neten a témában, igen kiváló Scott Guthrie cikke a webalkalmazások telepítéséről. Benne van képregény formában minden, nem csak a varázslás, hanem a saját telepítő készítése is. Röviden összefoglalva, így készítünk saját telepítő osztályt:

  1. Készítünk egy saját osztályt, ami az Installer osztályból származik.
  2. Odaragasztjuk elé a [RunInstaller( true )] attribútumot.
  3. Felüldefiniáljuk a megfelelő metódusát, például az Installt.
    • Így adunk át neki paramétert a Setup projektből:

      /targetdir="[TARGETDIR]" /targetvdir="[TARGETVDIR]" /targetsite="[TARGETSITE]"

    • Így dolgozzuk fel a paramétert:

      string targetDir = this.Context.Parameters[ "targetdir" ];

    • Hiba esetén InstallExceptiont dobunk.

Ez mind szép és jó, még arra is találunk példát a cikkben, hogy hogyan módosítsuk a web.config fájlt kódból. A connection string jó példa.

Ha viszont már jobban utánaolvasunk, akkor szinte csak olyan példákat fogunk találni, például az ASP.NET QuickStartban, ami az appSettings szekció tartalmát módosítja. De mi van akkor, ha nekem nem egy webalkalmazásom van, hanem például egy Windows Service projekt konfig fájlját akarom módosítani? Egy Windows Service projektben nyilván használni fogom a VS kódgeneráló képességeit és a Project Properties ablakban hozom létre a beállításaimat, ami valami ehhez hasonló XML kódot fog eredményezni a .config fájlban egy MyService nevű projekt esetén:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <configSections>
        <sectionGroup name="applicationSettings" 
                      type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MyService.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" /> </sectionGroup> </configSections> <applicationSettings> <!-- A Windows Service beallitasai --> <MyService.Properties.Settings> <setting name="InputFolderPath" serializeAs="String"> <value>C:ProgramDataBME AAITMyService</value> </setting> </MyService.Properties.Settings> </applicationSettings> </configuration>

A feladat pedig az, hogy az InputFolderPath beállítás értékét kell a telepítőnek beleírnia a MyService.exe.config állományba. Na erre valahogy nem találtam példát, és nem is sikerült egyszerűen megoldani:

    private static void WritePathToConfig( string targetFolder, string path )
    {
        string exePath = Path.Combine( targetFolder, "MyService.exe" );

        Configuration config = ConfigurationManager.OpenExeConfiguration( exePath );
        ClientSettingsSection section = 
          config.GetSection( @"applicationSettings/MyService.Properties.Settings" ) as ClientSettingsSection;
        section.SectionInformation.ForceSave = true;

        SettingElement element = section.Settings.Get( "InputFolderPath" );
        element.Value.ValueXml.InnerText = path;
        section.SectionInformation.ForceSave = true;

        config.Save();

        Properties.Settings.Default.Reload();
    }

Nem is bonyolult, csak szokatlan, hogy .NET-ben ennyit kell kódolni egy ilyen egyszerű feladathoz 🙂

 

Technorati tags: ,
Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s