Ответ 1
На сервере, на котором запущены службы терминалов, именованный системный мьютекс может иметь два уровня видимости. Если его имя начинается с префикса "Глобальный", мьютекс отображается во всех сеансах сервера терминалов. Если его имя начинается с префикса "Локальный", мьютекс виден только в сеанс сервера терминалов, где он был создан. В этом случае отдельные мьютексы с таким же именем могут существовать в каждом другом сеансы сервера терминалов на сервере. Если вы не указали префикс при создании именованного мьютекса он принимает префикс "Локальный". В пределах сеанс сервера терминалов, два мьютекса, имена которых отличаются только их префиксы представляют собой отдельные мьютексы, и оба они видны для всех процессов в сеансе сервера терминалов. То есть имена префиксов "Global \" и "Локальный" описывают объем имени мьютекса относительно терминала серверных сессий, а не относительно процессов.
Поскольку вы используете обратную косую черту в своем имени (\
), предполагается, что вы пытаетесь указать уровень видимости, а затем обнаруживаете, что localhost
не является допустимым уровнем видимости - следовательно, генерирует исключение.
Довольно странно, что в документах .NET явно не упоминается \
- зарезервированный символ в именах Mutex, документы Win32 лучше объясняют (ссылка)
Имя может иметь префикс "Глобальный" или "Локальный" для явного создания объект в глобальном или сеансовом пространстве имен. Остальная часть имя может содержать любой символ, кроме символа обратной косой черты(). Для Дополнительная информация, см. Пространства имен объектов ядра. Быстрая коммутация пользователей с использованием сеансов служб терминалов. Имена объектов ядра должны следуйте рекомендациям, изложенным для служб терминалов, приложения могут поддерживать несколько пользователей.