Позвольте мне немного прояснить мою точку зрения. По крайней мере, по-шелковисто, и я, кажется, интерпретирую это по-другому.
Насколько я понимаю, вы пытаетесь предотвратить одновременный вход нескольких пользователей (или нескольких экземпляров одного и того же пользователя) на машину . При этом вы предполагаете, что единственная цель машины - запустить ваше приложение, что, как правило, не так.
Использование подхода Silky (общесистемного мьютекса) для предотвращения запуска нескольких экземпляров на одном компьютере допустимо. Лично я хотел бы убедиться, что нет единственного допустимого варианта использования для одного пользователя, выполняющего два экземпляра вашего приложения, для выполнения задачи, прежде чем использовать этот подход.
См. Также эту любимую мозоль программиста . Запрет на использование несколькими пользователями одной и той же машины относится к одной категории;)
Что касается проблемы с несколькими версиями: выберите уникальное имя для общесистемного мьютекса для каждой (основной?) Версии приложения.
Базовый пример с общесистемным Mutex:
static class Program
{
private static Mutex appMutex = new Mutex(false, "Global\\MyApp 1.0");
[STAThread]
static void Main()
{
if (!appMutex.WaitOne(0))
{
MessageBox.Show("Application is already running. Have a nice day.");
return;
}
// ...
}
}
Префикс Global\
делает мьютекс общим для нескольких сеансов терминального сервера. Без этого он только запретил бы пользователю запускать два экземпляра в одном сеансе.
Вам следует протестировать этот подход на учетной записи с ограниченными правами, поскольку вполне возможно, что ограниченные учетные записи вообще не могут создать такой мьютекс.