Service is being created with executable path pointing to DLL instead of EXE
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?
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
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"
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?