Я знаю, что это не идеально, но мое ограничение заключается в том, что у меня есть устаревшее приложение, написанное на 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-адреса, что делает все последующие успешные запуски), но все они неоптимальны, хотя мы имеем большой контроль над нашими рабочими станциями.
Чтобы уменьшить вероятность того, что это связано сразрешения, мы дали стартовые права администратора (а также неадминистративные права на случай, если что-то изменится).
Любые идеи будут очень признательны.Как я уже сказал, у нас есть некоторые обходные пути, но я бы хотел их избежать.
Спасибо!