【问题标题】:Closing the client application using a Singleton class implementation使用 Singleton 类实现关闭客户端应用程序
【发布时间】:2013-04-23 05:15:22
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net visual-c++


    【解决方案1】:

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

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

    Audit process tracking

    How can I track what programs come and go on my machine?

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

    编辑:

    如果您有权访问 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);
    }
    

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

    【讨论】:

    • 但我的问题不在于父应用程序。当 parant 崩溃或停止时,我如何停止我的客户端应用程序。
    • 不,我无法访问 c++ 代码库。但我有客户端应用程序代码库。是否可以使用单例类从客户端应用程序管理它
    • 不,谁说你可以用单例(可以跨 AppDomains 和进程工作)来做到这一点,是在抽烟。
    【解决方案2】:

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

    或者

    how to close a window from a different process

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多