我有一个用 c# 编写的 .net 应用程序。此应用程序是从用 c++ 编写的父应用程序调用的。当父应用程序崩溃或意外关闭时,.net 应用程序仍然运行。但是当父应用程序崩溃或停止时,我也想关闭客户端应用程序。
我的一位同事说,我们可以使用单例类轻松实现这一点。我怎样才能做到这一点?
我有一个用 c# 编写的 .net 应用程序。此应用程序是从用 c++ 编写的父应用程序调用的。当父应用程序崩溃或意外关闭时,.net 应用程序仍然运行。但是当父应用程序崩溃或停止时,我也想关闭客户端应用程序。
我的一位同事说,我们可以使用单例类轻松实现这一点。我怎样才能做到这一点?
您将不得不轮询以查看父应用程序是否仍在运行。
一种方法是通过在 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);
}
如果未列出,请关闭子应用程序。
首先,您必须在父窗口引发异常或关闭时捕获事件。其次,您将发送关闭消息到已由父窗口启动的进程。有关发送关闭消息的信息,您可以在此处参考: Send message to a Windows process (not its main window)
或者