WMI-запрос в C # не работает на неанглийском компьютере - PullRequest
5 голосов
/ 10 мая 2011

Я создаю приложение, которое должно отслеживать начало процесса, а затем вызывать событие после его завершения.

У меня есть код, который отлично работает и выполняет именно то, что мне нужно, на английском компьютере, нокогда я запускаю то же приложение на машине с французским языком, оно терпит неудачу.

вот код, который терпит неудачу

qstart = new WqlEventQuery("__InstanceCreationEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");

qstop = new WqlEventQuery("__InstanceDeletionEvent",
            new TimeSpan(0, 0, 0, 0, 5),
            "TargetInstance isa \"Win32_Process\"");
        try
        {
            using (wstart = new ManagementEventWatcher(qstart))
            {
                wstart.EventArrived += new EventArrivedEventHandler(ProcessStarted);
                Log.DebugEntry("BeginProcess() - Starting wstart Event");
                wstart.Start();
            }
        }
        catch (Exception ex)
        {
            Log.DebugEntry("error on wstart: " + ex.Message);
        }

        using (wstop = new ManagementEventWatcher(qstop))
        {
            wstop.EventArrived += new EventArrivedEventHandler(ProcessStopped);
            Log.DebugEntry("BeginProcess() - Starting wstop Event");
            wstop.Start();
        }

ошибка появляется, когда он пытается запустить запрос: wstart.Start ();

и делает то же самое для wstop.Start ();

Я могу только догадываться, что это как-то связано с языком и строкой запроса, но я цепляюсь за соломинку.

Ошибка, с которой он сталкивается: "demande non анализируемый"

Любая помощь с благодарностью получена!

Martyn

Редактировать: Проверено на 2 одинаковых машинах, единственное отличие - язык, выбранный при первом запуске.

1 Ответ

6 голосов
/ 11 мая 2011

Очевидно, это потому, что указанный интервал слишком мал ... Я только что попробовал его на французской Windows XP SP3, и получил ту же ошибку. Но если я вместо этого изменю интервал на 1 секунду, он будет работать нормально ... Кажется, вы не можете указать интервал меньше 1 секунды. Не уверен, почему это происходит только в неанглийских ОС, хотя ...

РЕДАКТИРОВАТЬ: на самом деле я только что понял, что это, вероятно, ошибка в WqlEventQuery. qstart.QueryString выглядит так с CurrentCulture = "en-US":

select * from __InstanceCreationEvent within 0.005 where TargetInstance isa "Win32_Process"

Но с CurrentCulture = "fr-FR" это выглядит так:

select * from __InstanceCreationEvent within 0,005 where TargetInstance isa "Win32_Process"

(обратите внимание на разницу в числовом формате)

Так что, очевидно, код в WqlEventQuery не заставляет использовать инвариантную культуру для форматирования числа, что делает запрос некорректным в культурах, где десятичный разделитель не равен "."

Если принудительно установить CurrentCulture на CultureInfo.Invariant, запрос работает нормально даже на французской ОС. Вы также можете написать WQL-запрос вручную ...

...