Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从command.com启动WPF应用程序。I';我收到一个FontCache错误_Wpf_Clickonce_Cmd_Command_Clipper - Fatal编程技术网

如何从command.com启动WPF应用程序。I';我收到一个FontCache错误

如何从command.com启动WPF应用程序。I';我收到一个FontCache错误,wpf,clickonce,cmd,command,clipper,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#MyC

我知道这并不理想,但我的限制是我有一个用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中)或桌面上的图标启动应用程序,则不会出现异常,应用程序也不会按预期启动

最妙的是,无论我们首先启动什么,都将决定应用程序是否会启动。因此,如果我们首先使用legacy启动,它会立即崩溃,即使我们使用其他成功的URL或图标启动,我们也无法让应用程序运行。要让它工作,我们必须注销并重新登录,然后从URL或图标启动它

如果我们首先使用URL或图标,那么从该点开始从遗留应用程序启动不会有问题(直到我们注销并返回)

另一条信息是,我们能够以以下方式模拟问题。如果我们使用“cmd.exe”输入命令提示符并执行从URL启动的语句,我们就成功了。但是,如果我们使用“command.com”输入命令提示符并执行相同的语句,我们就会遇到中断行为

我们假设这是因为Clipper中的遗留应用程序使用command.com的等效程序来创建shell以生成另一个应用程序。我们已经尝试了一系列的破解方法,比如让command.com运行cmd.exe或psexec,然后执行,但似乎没有任何效果

我们有一些解决办法(比如在启动时启动应用程序,这样我们就可以从URL强制成功启动,使所有后续的启动都成功),但它们都是次优的,尽管我们对工作站有很大的控制

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

任何想法都将不胜感激。就像我说的,我们有一些解决办法,但我想避免它们


谢谢

这是在黑暗中拍摄的,信息不完整:

command.com和cmd.exe完全不同。另外,command.com的存在是为了与旧版兼容,因此您从它运行的应用程序将以不同的方式运行。我无法测试任何东西来完成我的文章,因为我相信command.com在16位模式下运行,64位版本的Windows(我正在运行)不再支持该模式,因此我不再使用command.com

也就是说,在尝试运行32位应用程序(包括托管应用程序)时应该没有区别

我不知道您的环境有哪些限制,但您可以尝试以下几点:

  • 将您的
    .bat
    重命名为
    .cmd
    ,以确保它以
    cmd.exe
    开头,而不是
    command.com
  • 使您的
    .bat
    使用
    start
    控制台命令启动程序
  • 有一个非WPF程序来调用您的WPF程序,使其具有更健全的环境

以这种方式启动应用程序时,演示文稿字体缓存服务似乎无法启动。
如果您可以控制客户端环境,则可以尝试将Windows演示文稿字体缓存启动设置为自动而不是手动。

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

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


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

我要问一个愚蠢的问题。您的应用程序针对的是.NET Framework的哪个版本,该版本是否安装在客户端计算机上?Framework是.NET 3.5 SP1。它安装在客户端上。此外,如果我们按正确的顺序启动(即直接启动,而不是通过传统方式启动)所有操作都完全按照预期进行。批处理文件的扩展名不会改变将执行它的应用程序。
.bat
.cmd
都使用
cmd.exe
start
运行,除了短暂打开另一个控制台窗口外,在这里也不会有任何区别。