Это не идеально, но вы могли бы, вероятно, сделать что-то вроде этого:
public static bool IsService()
{
ServiceController sc = new ServiceController("MyApplication");
return sc.Status == ServiceControllerStatus.StartPending;
}
Идея заключается в том, что если вы используете это в то время как ваша служба еще запускается, то он всегда будет находиться в состоянии ожидания. Если служба вообще не установлена, метод всегда будет возвращать значение false. В очень маловероятном угловом случае это приведет к тому, что служба начнет и кто-то пытается запустить ее как приложение одновременно.
Мне не нравится этот ответ, но я думаю, что это, вероятно, лучшее, что вы можете сделать. Реально не очень хорошая идея разрешить одному и тому же приложению работать в режиме службы или приложения - в конечном итоге это будет проще, если вы отринете всю общую функциональность в библиотеке классов и просто создадите отдельное сервисное приложение , Но если по какой-то причине у вас действительно есть действительно нужно иметь свой торт и съесть его тоже, вы, вероятно, могли бы объединить метод IsService
выше с Environment.UserInteractive
, чтобы получить правильный ответ почти все время.
взаимодействие с рабочим столом функция была удалена из Vista, и Win7. Это в основном решает вашу проблему, если не сегодня, то скоро. –
Возможный дубликат: http: // stackoverflow.com/questions/421516/how-to-write-c-service-that-i-can-also-run-as-a-winforms-program –
@nobugz Эта служба должна отслеживать некоторые пользовательские графические программы и поддерживать их работу, даже если они закрываются/сбой (киоск/терминал). Кажется, это действительно не очень хороший подход ... – mikoro