0

我有一个用 c# 编写的 .net 应用程序。此应用程序是从用 c++ 编写的父应用程序调用的。当父应用程序崩溃或意外关闭时,.net 应用程序仍然运行。但是当父应用程序崩溃或停止时,我也想关闭客户端应用程序。

我的一位同事说,我们可以使用单例类轻松实现这一点。我怎样才能做到这一点?

4

2 回答 2

1

您将不得不轮询以查看父应用程序是否仍在运行。

一种方法是通过在 Windows 中配置审计进程跟踪来设置应用程序运行的时间。以下链接可能会帮助您入门:

审计过程跟踪

如何跟踪我的机器上来来去去的程序?

进程跟踪将在 Windows 事件日志中创建条目,然后您可以使用 C++、C# 和/或 VB.Net 访问这些条目。您可以使用这些日志来查看父应用程序是否正在运行。

编辑:

如果您有权访问 C++ 代码库,则可以尝试在父应用程序崩溃或关闭时捕获异常,例如:

Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
    
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ApplicationUnhandledException);


private void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has crashed
}
private void ApplicationUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has crashed
}

private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has closed
}

否则,您将不得不轮询以查看父应用程序是否列在流程管理器中,例如:

StringBuilder sb = new StringBuilder();
ManagementClass MgmtClass = new ManagementClass("Win32_Process");

foreach (ManagementObject mo in MgmtClass.GetInstances())
{
    sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
    sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
    sb.Append(Environment.NewLine);
}

如果未列出,请关闭子应用程序。

于 2013-04-23T05:21:34.350 回答
0

首先,您必须在父窗口引发异常或关闭时捕获事件。其次,您将发送关闭消息到已由父窗口启动的进程。有关发送关闭消息的信息,您可以在此处参考: Send message to a Windows process (not its main window)

或者

如何从不同的进程关闭窗口

于 2013-04-23T05:44:11.733 回答