如何從運行對象獲取進程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對象並不總是現實可行的。我花了不少時間在我的項目上嘗試。不可行。 –