首页 > 解决方案 > WPF 程序启动进程,但无法正常启动、加载 .NET 程序集或创建窗口

问题描述

我有一个我编写的 .NET Framework 4.7.2 WPF 应用程序,它在我尝试过的每台计算机上都可以正常工作 - 除了在一个用户的计算机上(分别由另外 2 个人通过 TeamViewer 和 LogMeIn 远程访问)双击后EXE 文件(或从命令行运行它)进程出现在任务管理器中,但它不会“运行”或创建任何窗口。在执行进入 WPF 方法之前,应用程序的启动代码很少,Application.Run所以我不确定发生了什么。

这是在安装了 .NET Framework 4.8 的 Windows 7 SP1 x64 机器上。

任何 Windows 事件日志中都没有记录任何相关内容。

标签: wpf

解决方案


我在计算机上安装了 Microsoft 的Sysinternals Suite以使用Process Explorer ( ProcExp) 和Process Monitor ( ProcMon) 来查看进程在它坐在那里时实际在做什么,什么都不做。

ProcExp 透露,尽管是一个 .NET 进程,但该进程并未将任何 .NET 程序集加载到自身中——这表明 CLR 初始化过程中出现了问题(因为mscorlib.dll程序集应该在其他任何事情之前加载)。

我杀死了该进程,然后运行 ​​ProcMon 以在该进程启动时对其进行监视,并启动了该程序的一个新实例- ProcMon 显示该进程最初正常加载和读取系统文件-但由于某种原因,我看到它然后加载了C:\Users\$userName\AppData\Local\LogMeIn Rescue Applet\lmirhook.001.dll-然后该进程开始从SysWow64我的进程通常不加载的其他本机 DLL 加载,这些 DLL 与我假设 LogMeIn 正在加载的 Windows 的 Internet 堆栈相关。

我注意到计算机有两个同时运行的 LogMeInRescue 并发安装(或者至少在计算机管理 > 服务中有两个条目,名称中有不同的 GUID)。

我停止了两个 LogMeIn Rescue 会话,这意味着它们都立即自行卸载了 LogMeIn Rescue。在验证计算机上不再存在 LogMeIn Rescue 后,我看到我的程序现在开始运行而没有任何问题,并加载了 .NET Framework、.NET 程序集并按预期创建了窗口。

然后我从他们的网站重新打开 LogMeIn Rescue - 只运行一个 LogMeIn Rescue 实例(而不是在问题存在时运行的两个实例),我的程序也运行良好。

因此,显然每个 LogMeIn Rescue 实例都试图将自己的本机代码注入每个进程并且它停止了,大概是因为每个实例的注入代码由于某种原因与另一个实例的代码冲突,然后这会阻止进程的其余部分做任何事情,所以它坐在那里空闲(我怀疑它会导致主线程中止,但会创建另一个被阻塞的线程,因此 Windows 永远不会终止该进程,因为另一个线程没有被标记为后台线程(因为 Windows 永远不会用非后台线程终止进程) ,即使这些线程被阻塞)。

TL;博士:

确保计算机上没有运行 2 个或更多 LogMeIn Rescue 实例。如果是这样,请将它们都删除,再试一次,然后只允许 1 个实例返回。


推荐阅读