Vb.net 为什么在任务管理器中,当我关闭Form1时Excel进程不存在,而Outlook进程存在?

Vb.net 为什么在任务管理器中,当我关闭Form1时Excel进程不存在,而Outlook进程存在?,vb.net,excel-interop,Vb.net,Excel Interop,运行以下代码并检查任务管理器以查看Excel和Outlook进程是否存在: Imports Microsoft.Office.Interop Public Class Form1 Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load 'Kill all EXCEL.EXE's from Task Manager For Each prog As

运行以下代码并检查任务管理器以查看Excel和Outlook进程是否存在:

Imports Microsoft.Office.Interop

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

        'Kill all EXCEL.EXE's from Task Manager
        For Each prog As Process In Process.GetProcessesByName("EXCEL")
            prog.Kill()
        Next

        'Kill all OUTLOOK.EXE's from Task Manager
        For Each prog As Process In Process.GetProcessesByName("OUTLOOK")
            prog.Kill()
        Next

        'Open new EXCEL.EXE in the Task Manager
        Dim xlApp As New Excel.Application

        'Open new OUTLOOK.EXE in the Task Manager
        Dim olApp As New Outlook.Application

    End Sub

End Class
  • 关闭
    Form1

  • 检查任务管理器,查看Excel进程是否不存在,Outlook进程是否存在


  • 为什么在任务管理器中,当我关闭Form1时Excel进程不存在,而Outlook进程存在?

    请尝试这样启动Excel:

    Dim xlApp As New Process
    xlApp.StartInfo.FileName = "filePath/excel.exe"
    xlApp.Start
    
    如果没有帮助,请尝试以下方法启动exe:

    Process.Start("filePath\excel.exe")
    

    我无法重现您的问题。Outlook进程确实需要更长的时间才能结束,但它确实结束了

    也就是说,有更好的方法来关闭这些过程。正如我在评论中所说的,看看这个链接

    首先,您需要在类级别声明
    xlApp
    olApp
    。您还需要将以下方法添加到代码中:

    Private Sub ReleaseObject(ByVal obj As Object)
        Try
            Dim intRel As Integer = 0
            Do
                intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            Loop While intRel > 0
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
    
    然后,您可以在关闭表单时调用此方法:

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        xlApp.Quit()
        ReleaseObject(xlApp)
    
        olApp.Quit()
        ReleaseObject(olApp)
    End Sub
    
    总的来说,您的代码看起来与此类似:

    Public Class Form1
    
        Private xlApp As Excel.Application
        Private olApp As Outlook.Application
    
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    
            'Open new EXCEL.EXE in the Task Manager
            xlApp = New Excel.Application
    
            'Open new OUTLOOK.EXE in the Task Manager
            olApp = New Outlook.Application
    
        End Sub
    
        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
            xlApp.Quit()
            ReleaseObject(xlApp)
    
            olApp.Quit()
            ReleaseObject(olApp)
        End Sub
    
        Private Sub ReleaseObject(ByVal obj As Object)
            Try
                Dim intRel As Integer = 0
                Do
                    intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                Loop While intRel > 0
                obj = Nothing
            Catch ex As Exception
                obj = Nothing
            Finally
                GC.Collect()
            End Try
        End Sub
    
    End Class