Я успешно разработал и развернул приложение ClickOnce, которое регистрирует связанное расширение файла, например *.abc. Когда я нажимаю на файл с именем x.abc или, если я набираю x.abc из командной строки, запускается приложение ClickOnce, и я могу получить файл через выделенный API. Я также могу запустить приложение программно со следующим кодом:
System.Diagnostics.Process.Start ("x.abc");
Все отлично работает на моей Windows Vista 64 бит.
Однако, если я попытаюсь сделать то же самое на Windows 7 (также 64 бит), у меня возникла очень странная проблема. Вот что я наблюдаю:
- Ручной запуск
x.abcпутем двойного щелчка по нему из проводника. - Ручной запуск
x.abcиз командной строки работает. -
Process.Start("x.abc")не запускает приложение; однако возвращенный объект процесса показывает, что не было ошибки и что приложение ClickOnce каким-то образом вышло немедленно. Но дажеTraceв самом начале приложения ClickOnce никогда не достигается. - Еще страннее,
Process.Start("x.bat")с файломx.bat, содержащим единственную строкуx.abc, не запускает приложение ClickOnce! Тот жеx.batзапущен из работ проводника (конечно).
Попытка проанализировать, что происходит с ProcMon, была не очень полезной, так как процесс ClickOnce запуска приложения очень сложен с моей точки зрения. Я наблюдаю rundll32, чтобы работать, но никаких доказательств каких-либо сбоев.
Программа, которая выполняет Process.Start, представляет собой полное консольное приложение доверия, которое действительно ничего не представляет.
Я не вижу, что изменилось в отношении того, как приложения ClickOnce обрабатываются в Windows 7 и почему Process.Start не будет делать то же самое, что и запуск файла из Проводника. Стоит отметить, что использование более продвинутых версий метода Start с ProcessStartInfo и установка UseShellExecute в true тоже не помогли.
Запуск cmd с помощью Process.Start, а затем попытка запуска x.abc показывает точно такую же проблему. Если я сравниваю параметры среды с cmd, запущенными вручную, я вижу различия в том, как ProgramFiles определен (первый указывает на C:\Program Files (x86), а второй указывает на C:\Program Files). Приложения, запущенные с моего приложения .NET, запускаются на 32-битном уровне эмуляции (SysWoW64).
Я смог воспроизвести сбой запуска x.abc, запустив 32-битную версию командной строки (т.е. %windir%\SysWoW64\cmd.exe) и затем набрав x.abc в приглашении. Я также нашел уродливое обходное решение, которое должно запустить 64-битную командную строку из 32-битной среды, запустив %windir%\Sysnative\cmd.exe /C x.abc вместо x.abc.
Но я предпочел бы использовать чистый способ сделать это (или представитель Microsoft скажет мне, что это действительно проблема с Windows 7 и/или ClickOncce и что она будет исправлена в ближайшее время).