Сервис Topshelf не может найти dll - PullRequest
0 голосов
/ 06 июня 2019

У меня есть неуправляемая dll, которую я импортирую в консольное приложение c #:

[DllImport("mylib.dll", EntryPoint = "myfunction", CallingConvention = CallingConvention.Cdecl)]
public static extern void MyFunction();

Приложение работает просто отлично.

Затем я использую Topshelf для размещения своего консольного приложения в качестве службы:

 var rc = HostFactory.Run(x =>
        {
            x.Service<StartupService>();
            x.RunAsLocalSystem()
             .StartAutomatically()
             .EnableServiceRecovery(r =>
             {
                 r.RestartService(0);
                 r.SetResetPeriod(1);
             });

            x.SetStartTimeout(TimeSpan.FromSeconds(120));
            x.SetStopTimeout(TimeSpan.FromSeconds(120));
            x.SetDescription("my service");
            x.SetDisplayName("service");
            x.SetServiceName("service");
        });

Я устанавливаю и запускаю сервис так:

myapp.exe install
myapp.exe start

Служба запускается, но в журналах появляется сообщение о том, что она не может найти мою dll:

System.DllNotFoundException: Unable to load DLL 'mylib.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
  • DLL находится в том же каталоге, что и исполняемый файл приложения
  • Я добавил зависимости mylib.dll в PATH. (Я также безуспешно пытался скопировать их в каталог приложений).
  • Приложение работает нормально, когда я его запускаю .exe
  • Я добавил несколько других библиотек, и у службы нет проблем с их поиском

Обновление: Я попытался пройти полный путь и даже положить его в System32. Все равно не работает.

Спасибо!

...