Vb.net 识别当前正在运行的进程

Vb.net 识别当前正在运行的进程,vb.net,Vb.net,我需要识别当前运行的Excel进程id,以便将其与其他Excel进程id进行比较,以便删除其他非当前Excel进程。这是我所拥有的,但没有一个进程id=当前id。我做错了什么 将函数GetCurrentProcessId Lib“kernel32”()声明为Int32 Private Sub CheckMemory() Dim process As Process Dim xlProcessCount = process.GetProcessesByName("EXCEL").C

我需要识别当前运行的Excel进程id,以便将其与其他Excel进程id进行比较,以便删除其他非当前Excel进程。这是我所拥有的,但没有一个进程id=当前id。我做错了什么

将函数GetCurrentProcessId Lib“kernel32”()声明为Int32

Private Sub CheckMemory() Dim process As Process Dim xlProcessCount = process.GetProcessesByName("EXCEL").Count() Dim curProc As IntPtr = GetCurrentProcessId() Dim currentProcess As Process = process.GetProcessById(curProc) If xlProcessCount > 1 Then ' MsgBox("There are " + xlProcessCount + "Excel processes running", MsgBoxStyle.Information) 'Associate the current active "Excel.exe" process with this application instance 'and delete the other running processes Dim current = process.GetCurrentProcess() For Each process In process.GetProcessesByName("EXCEL") If process.Id <> currentProcess.Id Then MsgBox("Deleting a previous running Excel process", MsgBoxStyle.Information) process.Kill() ' releaseObject(xlApp) ' releaseObject(xlWb) ' releaseObject(xlWs) End If Next End If
专用子校验存储器() 作为过程的Dim过程 Dim xlProcessCount=process.getProcessByName(“EXCEL”).Count() Dim curProc As IntPtr=GetCurrentProcessId() Dim currentProcess As Process=Process.GetProcessById(curProc) 如果xlProcessCount>1,则 'MsgBox(“有“+xlProcessCount+”Excel进程正在运行”,MsgBoxStyle.Information) '将当前活动的“Excel.exe”进程与此应用程序实例关联 '并删除其他正在运行的进程 Dim current=process.GetCurrentProcess() 对于process.GetProcessesByName(“EXCEL”)中的每个进程 如果process.Id currentProcess.Id,则 MsgBox(“删除以前运行的Excel进程”,MsgBoxStyle.Information) process.Kill() '释放对象(xlApp) '释放对象(xlWb) '释放对象(xlWs) 如果结束 下一个 如果结束
要直接回答您的问题,您的代码“不起作用”,因为您的流程不是Excel流程。
GetCurrentProcessId()
返回的进程ID是EXE的ID,它不是Excel。所有Excel实例(即使是应用程序启动的实例)都是不同的进程,因此它们的进程ID永远不会与您的进程ID匹配

现在回答您的问题-您需要做的是确保正确清理Excel实例

实现这一点的最佳方法是完全不自动化Excel,而是使用可以创建Excel文件的库。有关一些示例,请参见此问题的答案:

如果出于某种原因需要使用Excel,则必须确保清除Excel应用程序返回的每个对象。这方面的一般规则是:

  • 在一次调用中使用的对象不得超过
    ——您需要存储对Excel返回的每个对象的引用
  • 使用
    Marhsal.ReleaseObject
    手动释放所有Excel COM对象

  • 有关更多详细信息,请参阅此问题。

    我们似乎已经走了一半,事情已经出了问题,您正在生成多个Excel进程并将其泄漏,您已经决定正确的修复方法是让泄漏继续,但要不断地将其清除。如果不是这样,您能否解释一下“当前活动”excel实例是什么,为什么它是特殊的,以及您通常尝试执行的操作。您当前的代码是否通过VSTO或类似方式在excel中运行?“当前运行”没有任何意义,excel.exe的所有副本都与当前运行的一样。COM不提供识别服务器的机制。GetCurrentProcessId()肯定不会工作,这是您的过程,永远不会出类拔萃。编写这样的代码是另一个问题的创可贴。现在你有两个问题Damien…你说得对。我注意到,如果应用程序未正确关闭或其他未检查的异常导致它,应用程序可能会产生多个进程。事情还没有出问题,但我正试图通过删除非当前Excel进程来防止内存泄漏的发生,这可能是最好的方法,也可能不是最好的方法。我可能首先需要防止内存泄漏的发生。我愿意接受有关如何处理此问题的建议。好的,谢谢shf301。。。我正在查看链接以及从该链接生成的链接。我想我可能有个解决办法。