我有一个 .NET Compact Framework 应用程序,它可以在三台 Windows 机器(桌面窗口和两台 WinCE 机器)和 WinCE 设备上运行,即使我调用 Application.Exit(),进程也不会在退出时终止。除了 .NET,它还使用一个 COM 组件(它在 UI 线程上做所有事情)。如果我在退出后闯入调试器,Visual Studio 只显示一个线程和一个完全空白的调用堆栈。
什么可能导致这种情况?
更新:我的进程在桌面上终止,但不是 WinCE 机器。我试图用以下代码强制进程终止,但它不起作用:
[DllImport("coredll.dll")]
static extern int TerminateProcess(IntPtr hProcess, uint uExitCode);
static public void ExitProcess()
{
if (Platform.IsWindowsCE)
TerminateProcess(new IntPtr(-1), 0);
Application.Exit();
}
还应该有如下所示的 ExitProcess() 和 GetCurrentProcess() API,但如果我尝试调用它们,我会得到 EntryPointNotFoundException。因此我使用 TerminateProcess(-1, 0) 因为桌面版 GetCurrentProcess 的文档声称它只是返回 -1。
[DllImport("coredll.dll")]
static extern int ExitProcess(IntPtr hProcess);
[DllImport("coredll.dll")]
static extern IntPtr GetCurrentProcess();
即使抛出未处理的异常也不会这样做。
更新 2:导致问题的最简单程序仅创建 COM 对象。
static void Main()
{
new FastNavLib.MapControl();
}
使用 COM 组件的 C++ 程序不会表现出这种行为,因此我的 C++ COM 组件必须与我将研究的 .NET 框架有一些奇怪的交互。