Core.System.Configuration.Install icon indicating copy to clipboard operation
Core.System.Configuration.Install copied to clipboard

Service is being created with executable path pointing to DLL instead of EXE

Open xeron opened this issue 4 years ago • 3 comments

We have a service installation code which works just fine with .NET Frameworks 4.8 Console application based on ServiceBase:

ManagedInstallerClass.InstallHelper(new string[] {  Assembly.GetExecutingAssembly().Location });
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace TestServiceInstall
{
    [RunInstaller(true)]
    public class TestServiceInstaller : Installer
    {
        public TestServiceInstaller()
        {
            ServiceProcessInstaller processInstaller = new ServiceProcessInstaller();
            ServiceInstaller serviceInstaller = new ServiceInstaller();

            // set the privileges
            processInstaller.Account = ServiceAccount.LocalSystem;

            serviceInstaller.DisplayName = GlobalVar.SERVICE_NAME;
            serviceInstaller.StartType = ServiceStartMode.Automatic;
            serviceInstaller.DelayedAutoStart = true;
            serviceInstaller.ServicesDependedOn = new string[] { "Tcpip" };

            // must be the same as what was set in Program's constructor
            serviceInstaller.ServiceName = GlobalVar.SERVICE_NAME;

            // installer code here
            this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);

            this.Installers.Add(processInstaller);
            this.Installers.Add(serviceInstaller);
        }

        void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            ServiceController sc = new ServiceController(GlobalVar.SERVICE_NAME);
            sc.Start();
        }
    }
}

We tried to migrate to .NET 6.0 and use this library to install the service in a same way we used to, but what happens is service binary path changed from EXE file to DLL file and we can't figure out how to point it to the EXE file.

We've tried changing Assembly.GetExecutingAssembly().Location to Environment.ProcessPath but it gives us the following error:

System.BadImageFormatException: Bad IL format. The format of the file '%EXE path here%' is invalid..

So the question is how can we use this library to install a windows service pointing to EXE file instead of DLL?

xeron avatar Dec 09 '21 00:12 xeron

Please provide a full exception stack trace for the first variant

ManagedInstallerClass.InstallHelper(new string[] {  Assembly.GetExecutingAssembly().Location });

I think you have the issue due to different runtimes. In the library we use Assembly.LoadFrom(Assembly.GetExecutingAssembly().Location ) https://github.com/flamencist/Core.System.Configuration.Install/blob/11ba4919733be478c9169aa568ab1dfeff2be421/System.Configuration.Install/System.Configuration.Install/ManagedInstallerClass.cs#L50

flamencist avatar Dec 09 '21 10:12 flamencist

It didn't show me the stack trace besides my own code:

PS Y:\> .\bin\Release\net6.0-windows10.0.22000.0\TestService.exe --install
ERROR 2021-12-07 14:41:15,428 - Exception running TestService: System.InvalidOperationException: Exception occurred while initializing the installation:
System.BadImageFormatException: Bad IL format. The format of the file 'Y:\bin\Release\net6.0-windows10.0.22000.0\TestService.exe' is invalid..
   at System.Configuration.Install.ManagedInstallerClass.InstallHelper(String[] args)
   at TestService.Program.Main(String[] args) in Y:\Program.cs:line 168

And with Assembly.GetExecutingAssembly().Location there're no errors, service is being created, but binPath points to TestService.dll instead of TestService.exe and it doesn't start.

The following fixes it and service starts just fine:

sc.exe config "Test Service" binPath="Y:\bin\Release\net6.0-windows10.0.22000.0\TestService.exe"

xeron avatar Dec 09 '21 19:12 xeron

Hm... I'm not sure that the bug is related to this package because the package does not use SCM. How do you install the service? Do you use ServiceProcessInstaller from System.ServiceProcess.dll?

flamencist avatar Dec 21 '21 18:12 flamencist