Я успешно разработал и развернул приложение 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 и что она будет исправлена в ближайшее время).