如何从运行对象获取进程ID?如何从创建的“Excel.Application”对象获取进程ID?
Dim xlApp As Object = CreateObject("Excel.Application")
我需要使用后期绑定,因为我不能保证我会得到这样使用Microsoft.Office.Interop.Excel
将无法正常工作的版本。
'do some work with xlApp
xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = nothing
此时Excel仍在后台运行。我熟悉所有使用变量的建议并释放它们,然后使用:System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
。这并不可靠。我所做的工作非常复杂。我使用每个循环等使用多个文件。在Excel中释放所有资源是不可能的。我需要一个更好的选择。
我想在Excel上使用Process.Kill
,但我不知道如何从xlApp对象获取进程。我不想杀掉所有的Excel进程,因为用户可能打开了一个工作簿。
我尝试使用Dim xProc As Process = Process.Start(ExcelPath)
然后使用xProc.Kill()
这工作有时但它是一个有点棘手使用XLApp = GetObject("Book1").Application
或XLApp = GetObject("", "Excel.Application")
如果用户已经拥有了Excel中打开窗户,以获得正确的Excel对象。我需要一个更好的选择。
我不能使用GetActiveObject
或BindToMoniker
来获取Excel对象,因为它们只能在使用早期绑定时使用工作。例如。 Microsoft.Office.Interop.Excel
如何从运行对象中获取进程ID?
编辑:其实我并不真正感兴趣的重新如何让Excel很好地退出。许多其他问题解决了这个问题。 here和here我只是想杀死它;干净,准确和直接。我想杀死我开始的确切过程,而不是其他的。
*不使用更可靠的工作* [您是否泄漏COM对象而不是一个'。'?](http://stackoverflow.com/questions/2191489/releasing-temporary-com-objects) –
这是在“不是答案”的领土,但你有没有考虑[EPPlus](http:///epplus.codeplex.com/)?它对Excel的功能有很好的支持,并且不会让进程悬而未决[在Office自动化界面带来的所有其他不好的事情中](http://support.microsoft.com/kb/257757)。 –
@ ta.speot.is在Excel中声明和释放所有COM对象并不总是现实可行的。我花了不少时间在我的项目上尝试。不可行。 –