У меня есть неуправляемая 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. Все равно не работает.
Спасибо!