Skip to content

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

Open

Description

@xeron

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?

Activity

  1. flamencist commented on Dec 9, 2021

    @flamencist
    Owner

    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 )

    assembly = shouldLoadByName ? Assembly.Load(arg) : Assembly.LoadFrom(arg);

  2. xeron commented on Dec 9, 2021

    @xeron
    Author

    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"
    
  3. flamencist commented on Dec 21, 2021

    @flamencist
    Owner

    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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions