如何从command.com启动WPF应用程序。我收到了FontCache错误

时间:2010-04-06 21:47:21

标签: wpf clickonce cmd command clipper

我知道这不太理想,但我的约束是我有一个用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"

它正在启动我们通过ClickOnce部署的WinForms / WPF应用程序。在我们将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中的遗留应用程序使用相当于command.com来创建shell来生成其他应用程序。我们尝试了一些hack,比如让command.com运行cmd.exe或psexec然后执行,但似乎没什么用。

我们有一些解决方法的想法(比如在启动时启动应用程序,以便我们强制从URL成功启动,使所有后续启动成功),但即使我们有很多控制权,它们都是次优的在我们的工作站上。

为了减少这与权限相关的可能性,我们已经为启动帐户授予了管理权限(以及在产生差异的情况下的非管理权限)。

任何想法都会非常感激。就像我说的,我们有一些工作,但我很想避免它们。

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来,当以这种方式启动应用程序时,Presentation Font Cache服务无法启动。 如果您可以控制客户端环境,则可以尝试将Windows Presentation Font Cache启动设置为自动而不是手动。

答案 1 :(得分:0)

这是一个黑暗的镜头,信息不完整:

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程序

答案 2 :(得分:0)

问题是使用windir时未设置command.com环境变量。

因此,在您的情况下,将行set windir=C:\Windows添加到bat文件的开头将解决问题(假设您在C:\Windows中安装了Windows。

另一个问题可能是主机应用程序在兼容模式下运行command.com。最好的方法是在运行cmd.exe(使用set命令)并将其与您在bat文件中设置的set命令的输出进行比较后列出所有环境变量