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:\ProgramData\BME AAIT\MyService</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 :)



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2007.09.04. 17:50:41 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • VaryByParam gond

    Dávid Zoltán Ez ismét csak egy rövid megjegyzés, azért, hogy legközelebb ne szívjak vele. Ha oldal OutputCache esetén külön szeretnénk gyorsítótárazni POST/QueryString paraméterek alapján, akkor ezt a VaryByParam attribútumban jelezhetjük. Az MSDN alapján ezeket a paramétereket vesszővel kell elválasztani. Nekem nem működött így. Viszont pontosvesszővel igen. Tovább »
  • Hova tűnt az Add?

    Balássy György (MS RD, ASP.NET MVP, MCTS) A minap azzal küzdöttem, hogy Visual Studio 2008 Release Candidate alatt próbáltam működésre bírni egy LINQ to SQL-es projektet, ami Beta 2 alatt készült. Keserves küzdés volt, mert nagyon nem hagyta magát, hiányzott neki a generált entitás osztályokon az Add metódus. Reménykedtem, hogy nem azt képzeli, majd én fogom megírni?! A Beta 2-ben még biztosan volt a Table<T> típusnak Add metódusa, most meg csak ezt kántálja a fordító. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások