[Mono-list] Re: mono-service

Bradley, Peter PBradley at uwic.ac.uk
Tue Nov 1 09:07:59 EST 2005


Hi Elliott,

What you say is true for Console servers in Windows and for normal executable assemblies, but not - according to the documentation I have read - for Services.  Here is the relevant quotation from David Conger, "Remoting with C# and .NET", (2003), Wiley, pp209-210:

"Next, the OnStart() method calls RemotingConfiguration.Configure() to publish the [remote object] ... as a remote object ... The startup directory for any Windows Service is:

<OS drive>:<OS Dir>\system32

Where <OS Drive> and <OS Dir> is the drive letter and directory where your operating system is installed ... The configuration file for remote object servers must be placed in the startup directory for Windows Services.  Therefore, on my computer, I had to put the [application].exe.config file ... in the C:\WINNT\system32 directory."

Ingo Rammer, "Advanced .NET Remoting in VB.NET", (2002), Apress, p115 says:

"When using configuration files with Windows services, those files have to be placed in <%WINDIR%>\System32 (normally c:\winnt\system32) to be readable by the application, as this is the service's startup directory."

Other published sources say the same thing.  Are you sure this is not the case?

In fairness, Rammer does give a way of using the application's installation directory by using code like this:

RemotingConfiguration.Configure(
	AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)

I haven't tried that though, and I'd rather not if I don't have to because I don't understand it :(

Cheers


Peter

-----Original Message-----
From: Elliott Draper [mailto:el at eldiablo.co.uk] 
Sent: 01 November 2005 13:49
To: Bradley, Peter
Cc: mono-list at lists.ximian.com
Subject: Re: [Mono-list] Re: mono-service

Bradley, Peter wrote:

>I wonder if I might be forgiven for responding to myself in order to ask one (hopefully final) question about mono-service?
>
>Following the discussion here, I checked out some Windows services I've written and everything seems fine except for one thing.  The services I write are to host remote objects.  As a matter of policy we configure .NET remoting using configuration files.  Therefore host services contain a call to RemotingConfiguration.Configure("config.file.name").
>
>Under Windows, the config file must be copied to the WINDOWS\System32 (or WINNT\System32) directory for it to be found by the service.  Where should the config file be located under Mono in order for the daemon to find it?
>  
>
You don't have to place the config files in System32 for them to be 
found, you can give a full path to the call to 
RemotingConfiguration.Configure. I find the easiest way is to stick your 
remoting config in with any other configuration you might have within an 
application configuration file ("$assemblyname.config"). Are you 
familiar with these? Just in case...
    If using Visual Studio, you can add a new "Application Configuration 
file" to your project (app.config), and place all config in there. At 
compile time, a built-in build event will take care of copying this file 
to your "bin" directory, and re-naming it "$assemblyname.config", for 
example, "myservice.exe.config".
    If your not using Visual Studio, then you can manage the config file 
however you want, however it needs to end up in the same directory as 
your executable, named the same as your executable but with ".config" on 
the end, e.g. "myservice.exe.config". I tend to have an App.config in 
the root of my executables project, and I get NAnt to copy the file over 
to my "bin" directory and re-name it at compile time, just like VS.

Either way, once you have your correctly named configuration file 
residing within the same directory as your executable, your call to 
RemotingConfiguration.Configure becomes nice and easy:

    
RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

This grabs the full path of the configuration file from the current app 
domain, and should load your remoting configuration without problems. 
You can then move the service around without issue, providing that the 
config file stays with the executable ;-)

AFAIK this works just as well on Mono as it does on .Net.

>Thanks for your patience.
>
>
>Peter
>  
>
Hope that helps!

-= El =-

>
>-----Original Message-----
>From: Jörg Rosenkranz [mailto:joergr at voelcker.com] 
>Sent: 01 November 2005 12:52
>To: Bradley, Peter; Robert Jordan; mono-list at lists.ximian.com
>Subject: RE: [Mono-list] Re: mono-service
>
>Hi Peter,
>
>  
>
>>-----Original Message-----
>>From: mono-list-bounces at lists.ximian.com 
>>[mailto:mono-list-bounces at lists.ximian.com] On Behalf Of 
>>Bradley, Peter
>>Sent: Tuesday, November 01, 2005 1:26 PM
>>
>>My post was not intended as a criticism of the man page, and I'm very
>>sorry if it appeared to be so.  Perhaps I should have been 
>>clearer, but
>>what I was really saying that what (I think) is needed is a HowTo.
>>    
>>
>
>Yes I think this is true. There needs to be something in the Wiki.
>
>To answer some of your questions:
>
>  
>
>>Does the process to be run as a daemon have to inherit from
>>System.ServiceProcess.ServiceBase?  Does it guarantee that the
>>OnStart(), OnStop(), OnPause(), and OnContinue() methods get called as
>>appropriate?  
>>    
>>
>
>The service has to be implemented according to the MS docs:
>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemserviceprocessservicebaseclasstopic.asp
>and
>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemserviceprocessservicebaseclassruntopic1.asp
>
>Short: It needs to be inherited from ServiceBase and it needs to call 
>ServiceBase.Run in it's Main method.
>
>  
>
>>What does one have to do make the service start 
>>up at boot
>>time and run without a user logged in?  (Your script is a 
>>great help in
>>that regard.  Thanks).  What user does the service run as?  
>>    
>>
>
>It runs as the user you are starting mono-service with. You
>are responsible for switching the user in the start script.
>Examples of start scripts should be in the Wiki/Doc/etc. too.
>Maybe that's tootoo distribution specific to put it into SVN?
>
>  
>
>>What changes
>>(if any) are required to assemblies written as Windows 
>>services to make
>>sure they can run as daemons?
>>    
>>
>
>There are no changes needed if the assemblies are written
>with the normal portability rules in mind. Mono-service 
>should mimic the behaviour of MS' implementation as close 
>as possible.
>
>  
>
>>The OP obviously has trouble getting the OnStart() method 
>>running.  The
>>reason why might be contained in the answers to the questions I make
>>above.
>>    
>>
>
>Yes :-)
>
>  
>
>>I'm perfectly happy to put my money where my mouth is as far as
>>producing a HowTo is concerned.  Once I've got a daemon 
>>running, I'll be
>>only too happy to explain how it was done.  But I may need my hand
>>holding a little in the meantime :)
>>    
>>
>
>The man page is very basic and contains only information about 
>handling of services. There should be an article about implementation
>of services too. I would be happy if you write a howto down.
>Please ask if you have any questions.
>
>Joerg.
>_______________________________________________
>Mono-list maillist  -  Mono-list at lists.ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list
>
>_______________________________________________
>Mono-list maillist  -  Mono-list at lists.ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list
>  
>

_______________________________________________
Mono-list maillist  -  Mono-list at lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-list



More information about the Mono-list mailing list