Как запустить приложение WPF с command.com. Я получаю ошибку FontCache - PullRequest
2 голосов
/ 07 апреля 2010

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

Я хочу запустить новое приложение WinForms / WPF изнутри приложения (для облегчения перехода),Это устаревшее приложение, написанное на Clipper, запускается с использованием:

SwpRunCmd("C:\MyApp\MyBat.bat",0)

Пакетный файл содержит что-то вроде этой команды:

C:\PROGRA~1\INTERN~1\iexplore "http://QASVR/MyApp/AppWin/MyCompany.MyApp.AppWin.application#MyCompany.MyApp.AppWin.application"

Он запускает приложение WinForms / WPF, которое мы разворачиваем через ClickOnce,Все шло хорошо, пока мы не внедрили WPF в приложение.Мы смогли легко запустить из унаследованного приложения.

Поскольку мы ввели WPF, мы имеем следующее поведение.Если мы сначала запустим приложение Clipper, мы получим исключение при запуске приложения.Текст ошибки:

The type initializer for 'System.Windows.FrameworkElement' threw an exception.
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Panel..ctor()
   at System.Windows.Controls.DockPanel..ctor()
   at System.Windows.Forms.Integration.AvalonAdapter..ctor(ElementHost hostControl)
   at System.Windows.Forms.Integration.ElementHost..ctor()
   at MyCompany.MyApp.AppWin.Main.InitializeComponent()
   at MyCompany.MyApp.AppWin.Main..ctor(String[] args)
   at MyCompany.MyApp.AppWin.Program.Main(String[] args)

The type initializer for 'System.Windows.Documents.TextElement' threw an exception.
   at System.Windows.FrameworkElement..cctor()

The type initializer for 'System.Windows.Media.FontFamily' threw an exception.
   at System.Windows.Media.FontFamily..ctor(String familyName)
   at System.Windows.SystemFonts.get_MessageFontFamily()
   at System.Windows.Documents.TextElement..cctor()

The type initializer for 'MS.Internal.FontCache.Util' threw an exception.
   at MS.Internal.FontCache.Util.get_WindowsFontsUriObject()
   at System.Windows.Media.FontFamily.PreCreateDefaultFamilyCollection()
   at System.Windows.Media.FontFamily..cctor()

Invalid URI: The format of the URI could not be determined.
   at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
   at System.Uri..ctor(String uriString, UriKind uriKind)
   at MS.Internal.FontCache.Util..cctor()

Если мы сначала запустим приложение через URL (в IE) или через значок на рабочем столе, мы не получим исключение, и приложение запустится, как и ожидалось.

Замечательно, что то, что мы запускаем сначала, определяет, будет ли приложение запускаться вообще.Таким образом, если мы сначала запустим устаревшую версию, она сразу же выйдет из строя, и мы не сможем запустить приложение, даже если запустим успешный URL-адрес или значок.Чтобы заставить его работать, мы должны выйти из системы и снова войти в нее и запустить ее с URL-адреса или значка.

Если мы сначала используем URL-адрес или значок, у нас не возникает проблем при запуске из устаревшего приложения из этогоУкажите вперед (пока мы не выйдем и не вернемся).

Еще одна информация - это то, что мы можем смоделировать проблему следующим образом.Если мы введем командную строку с помощью «cmd.exe» и выполним инструкцию для запуска с URL-адреса, мы добьемся успеха.Однако, если мы вводим командную строку с использованием «command.com» и выполняем ту же инструкцию, мы испытываем нарушение поведения.

Мы предполагаем, что это потому, что унаследованное приложение в Clipper использует эквивалент команды.com, чтобы создать оболочку для порождения другого приложения.Мы пробовали кучу хаков, таких как запуск command.com cmd.exe или psexec с последующим выполнением, но, похоже, ничего не работает.

У нас есть несколько вариантов обходных путей (например, запуск приложения при запуске, поэтому мывызвать успешный запуск с URL-адреса, что делает все последующие успешные запуски), но все они неоптимальны, хотя мы имеем большой контроль над нашими рабочими станциями.

Чтобы уменьшить вероятность того, что это связано сразрешения, мы дали стартовые права администратора (а также неадминистративные права на случай, если что-то изменится).

Любые идеи будут очень признательны.Как я уже сказал, у нас есть некоторые обходные пути, но я бы хотел их избежать.

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 апреля 2010

Похоже, что служба Presentation Font Cache имеет проблемы с запуском, когда приложение запускается таким образом. Если у вас есть контроль над клиентской средой, вы можете попробовать установить автоматический запуск кэша шрифтов Windows Presentation на автоматический вместо ручного.

0 голосов
/ 08 ноября 2010

Проблема в том, что переменная окружения windir не установлена ​​при использовании command.com.

Таким образом, в вашем случае добавление строки set windir=C:\Windows в начало файла bat решит проблему (при условии, что у вас установлена ​​Windows * в C:\Windows.

Дополнительной проблемой может быть то, что хост-приложение работает command.com в режиме совместимости. Лучше всего перечислить все переменные окружения после запуска cmd.exe (с помощью команды set) и сравнить его с выводом команды set, которую вы задали в файле bat

0 голосов
/ 07 апреля 2010

Это выстрел в темноте, сделанный с неполной информацией:

command.com и cmd.exe совершенно разные. AFAIK, command.com существует для устаревшей совместимости, поэтому приложения, которые вы запускаете из него, будут работать по-другому. Я не могу ничего проверить, чтобы завершить свой пост, потому что я считаю, что command.com работает в 16-битном режиме, а 64-битные версии Windows (на которых я работаю) больше не поддерживают этот режим, так что больше не нужно command.com для я.

При этом не должно быть никакой разницы при попытке запуска 32-разрядных приложений (включая управляемые приложения).

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

  • Переименуйте вас .bat в .cmd, чтобы убедиться, что он начинается с cmd.exe, а не command.com
  • Заставьте .bat запустить программу, используя консольную команду start
  • Иметь не-WPF программу для вызова вашей WPF с более здоровой средой
...