Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[.NET Windows Service] Dynamische installer

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik heb hier een aantal windows services gebouwd die mijn WCF Services hosten. Ik wil deze nu via mijn eigen management programma als service in Windows installeren. Ik wil geen gebruik maken van de InstallUtil tool van Visual Studio, maar direct via wat code in mijn applicatie de service beheren. Weet iemand hier een oplossing voor? Dus hoe installeer/deinstaleer ik een Windows Service via code. Graag een managed code wat misschien al in .NET bestaat posten en anders een eigen stuk code hiervoor posten.

Verder wil ik liefst met .dll assembly's werken zodat ik dynamisch services in mijn applicatie kan toevoegen en beheren. Ik heb een serviceapplicatie gebouwd met daarin de Main functie waaraan argumenten gegeven kunnen worden. Hiermee wil ik straks bepaalde assemblys laden als services. Voorbeeld testservice.dll is één service. In deze service wil ik ook de functionaliteit dus inbouwen voor STOP, START, INSTALL en UNINSTALL.

Zo kan ik straks meerdere assemblys maken met dezelfde structuur en vervolgens managen via mijn Windows applicatie.

code:
1
2
3
4
5
myservicerunner.exe [assembly.dll] [service action]
myservicerunner.exe testservice.dll start
myservicerunner.exe testservice.dll stop
myservicerunner.exe testservice.dll install
myservicerunner.exe testservice.dll uninstall


Iemand ideen hiervoor?

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Als je in VS2005 een leeg Windows Service solution start, krijg je volgens mij daar een Installer project bij; daarin staat code om een service te installeren ... En anders moet een beetje google'n vast voldoende zijn ;)

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Verwijderd

Topicstarter
SKiLLa schreef op donderdag 18 oktober 2007 @ 20:12:
Als je in VS2005 een leeg Windows Service solution start, krijg je volgens mij daar een Installer project bij; daarin staat code om een service te installeren ... En anders moet een beetje google'n vast voldoende zijn ;)
Nou... ik ben de hele dag ermee bezig... :) Ben al kappot van zoeken. Een beetje hulp kan ik wel gebruiken, anders had ik hier ook geen topic gestart ;)

En... een standaard solution genereerd wel een installer. Maar die wordt dan volgens mij verder gebruikt door de VS InstallUtil???

[ Voor 13% gewijzigd door Verwijderd op 18-10-2007 20:16 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op donderdag 18 oktober 2007 @ 20:09:
Graag een managed code wat misschien al in .NET bestaat posten en anders een eigen stuk code hiervoor posten.
Howhow; mensen zijn hier niet verplicht om kant en klare code te gaan posten; dit is geen scriptrequest forum.
Verder denk ik niet dat het mogelijk is om je 'service' te gaan managen als die niet ge-installeerd is als Windows Service.
Je hebt zowiezo wel de mogelijkheid om je eigen services te gaan 'managen' mbhv de ServiceController class, maar ik vermoed toch dat je service dan zowiezo als service moet geinstalleerd worden.
Verder wil ik liefst met .dll assembly's werken zodat ik dynamisch services in mijn applicatie kan toevoegen en beheren. Ik heb een serviceapplicatie gebouwd met daarin de Main functie waaraan argumenten gegeven kunnen worden. Hiermee wil ik straks bepaalde assemblys laden als services. Voorbeeld testservice.dll is één service. In deze service wil ik ook de functionaliteit dus inbouwen voor STOP, START, INSTALL en UNINSTALL.
Is het geen beter idee om één service te hebben die je verschillende taken kan uitvoeren, en dat je dus met die ene service kan gaan bepalen of een bepaalde taak nog moet uitgevoerd worden, gestopt worden, etc... ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami, ten eerste, sorry voor mijn vraag over kant en klare code :)

Ik snap dat die service eerst geinstalleerd moet worden, hoor. Dat wil juist via mijn applicatie gaan doen. Dus een service installeren via een WIndows Applicatie via een knopje of zow... Dat zie je vaak bij server applicaties (Administrator tools)

Één service gebruiken is niet wat ik wil, omdat binnen mijn project service-modulen erbij kunnen komen. Om nou weer een nieuwe versie te maken van de ene service wat jij bedoeld is niet erg effectief, vooral omdat ik dan alle diensten van die service moet stoppen. Als ik de boel ga scheiden, dan kan de rest alsnog draaien ;)

[ Voor 4% gewijzigd door Verwijderd op 18-10-2007 20:25 ]


  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

1 poging op Google, oa. de 3e hit (random geklikt) bevat je benodigde code:

KLIK :+

PS: Is wel uitsluitend Install code, maar ik vermoed dat het deinstalleren via ongeveer dezelfde classes gaat. Starten en stoppen kan met WMI en (de-)installeren kan eventueel ook door gewoon naar het registry te schrijven en de files te verwijderen.

[ Voor 44% gewijzigd door SKiLLa op 18-10-2007 20:30 ]

'Political Correctness is fascism pretending to be good manners.' - George Carlin


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op donderdag 18 oktober 2007 @ 20:24:
whoami, ten eerste, sorry voor mijn vraag over kant en klare code :)

Ik snap dat die service eerst geinstalleerd moet worden, hoor. Dat wil juist via mijn applicatie gaan doen. Dus een service installeren via een WIndows Applicatie via een knopje of zow... Dat zie je vaak bij server applicaties (Administrator tools)
Dat moet geen probleem zijn om dat te doen; zowiezo zal je de nodige ServiceInstaller classes nodig hebben, maar die InstallUtil zal dan ook gwoon die ServiceInstaller class gaan aanspreken.
Kwestie dat jij dus gewoon in jouw applicatie er voor zorgt dat je die Installer class ook op de juiste manier gaat gaan aanspreken...

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 18 oktober 2007 @ 20:35:
[...]Kwestie dat jij dus gewoon in jouw applicatie er voor zorgt dat je die Installer class ook op de juiste manier gaat gaan aanspreken...
Heb je hier al ervarin mee. Het gaat dan denk ik om de ProjectInstaller.vb (Installer Class), maar kun je door simpelweg naar een functie binnen deze klasse te verwijzen de service installeren? De Install en Uninstall methoden binnen deze klassen verwachten nog een IDictionary (de state van de service). Heeft iemand een voorbeeld regel code voor dit stukje?

Verwijderd

Topicstarter
In het artikel "How to Create a Simple Polling Service" van codeproject wordt al wat uitgelegd. Alleen installeren ze de service daar wel via een setup project.

Dit wil ik niet. Ik wil dit via een gewone applicatie doen door de installer van de service te benaderen. In het artikel hebben ze het ook over /install en /uninstall parameters van de .exe maar dat werkt bij mij niet.

Nu is dus de vraag hoe ik de service kan installeren en deinstalleren via de ProjectInstaller klasse van de service. Er zijn twee functies, Install en Uninstall. Beide willeen de state van de service hebben als IDictionary.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 06:38

Gerco

Professional Newbie

Hier is wat eenvoudige code die een service installeert die ik ooit geschreven heb. Deze exe installeert zichzelf als service, vandaar de GetExecutingAssembly(). Als je een andere Assembly wilt installeren, zul je daar eerst een reference naar moeten regelen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Console.Write("Installing service " + AmadeusAdapterService.AdapterServiceName  + "... ");
Hashtable savedState = new Hashtable();   
System.Configuration.Install.AssemblyInstaller ai =
   new System.Configuration.Install.AssemblyInstaller(
      Assembly.GetExecutingAssembly(), new String[] { "/LogToConsole=false" });
ai.UseNewContext = true;

try
{
   ai.Install(savedState);
   ai.Commit(savedState);
   Console.WriteLine("done.");
}
catch (Exception e)
{
   Console.WriteLine("error: " + e.Message);
}


Deze code zorgt ervoor dat je Installer gedraaid wordt, dus je moet elders in je Assembly nog wel zo'n installer gemaakt hebben:
C#:
1
2
3
4
5
6
7
8
[RunInstaller(true)]
public class AmadeusAdapterServiceInstaller : Installer
{
   public AmadeusAdapterServiceInstaller(): base()
   {
      ... installer code ...
   }
}

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Bedankt voor de code ;)

Ik heb het volgende van gemaakt, omdat ik niet wil dat mijn service meteen geinstalleerd wordt wanneer de constructor wordt aangeroepen. Ik heb twee eigen functies gemaakt voor Installeren en Uninstalleren. Alleen nog goed teste :P

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        private Hashtable savedState;
        System.Configuration.Install.AssemblyInstaller ai;

        public ProjectInstaller()
        {
            InitializeComponent();

            savedState = new Hashtable();   
            ai = new System.Configuration.Install.AssemblyInstaller(Assembly.GetExecutingAssembly(), new String[] { "/LogToConsole=false" });
            ai.UseNewContext = true;
        }

        public void InstallService()
        {
            try
            {
                ai.Install(savedState);
                ai.Commit(savedState);
            }
            catch (Exception e)
            {
                Console.WriteLine("error: " + e.Message);
            }
        }

        public void UninstallService()
        {
            try
            {
                ai.Uninstall(savedState);
                ai.Commit(savedState);
            }
            catch (Exception e)
            {
                Console.WriteLine("error: " + e.Message);
            }
        }
    }

Verwijderd

Topicstarter
Ik heb nog een console applicatie gemaakt die de installer test: Apart project met referentie naar de service assembly. Hieronder de code ;)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
    {
        static void Main(string[] args)
        {
            WindowsService1.ProjectInstaller inst = new WindowsService1.ProjectInstaller();
            
            Console.WriteLine("Press a key to install the service...");
            Console.ReadKey();
            inst.InstallService();
            Console.WriteLine("Service installed :)");


            Console.WriteLine("Press a key to remove the service...");
            Console.ReadKey();
            inst.UninstallService();
            Console.WriteLine("Service removed :)");

            Console.WriteLine("Tweakers is the best :P");
            
        }
    }


Werkt perfect. Geen gezeur meer dus met andere tools. Dit is wat ik zocht: simpel en managed code _/-\o_
Pagina: 1