2017-10-19 64 views
0

我有Visual Studio中的作用是制定了一个非常小而简单的VB应用程序:VB应用程序留下hunging背景Excel进程截至申请退出

  1. 打开Excel工作簿(其中包括一些计算公式)
  2. 向INPUT单元中输入参数值
  3. 从预定义的单元格中检索结果的值。

Excel运行时没有人机界面(即Excel_Application.Visible = False)。

一旦计算完成(以及结果的检索)下面的命令被执行:即使经过

: 
Excel_Workbook.Close(False) 
Excel_Workbook = Nothing 
Excel_Application.Quit() 
Excel_Application = Nothing 
: 

这些语句被执行时,在看任务管理器被示出一个Excel过程时。当应用程序被要求结束时(例如,点击窗口的“X”按钮),该过程被移除。

需要注意的是,如果我打开图形界面,任务栏中的图标在Excel_Application.Quit()后消失,但后台进程仍然存在。

我需要在不关闭应用程序的情况下不保留后台进程的能力。

我在网上搜索并找到了一些建议,但都没有成功。

我非常感谢任何富有成效的建议。

+1

也许这篇文章可以帮助https://开头stackoverflow.com/q/158706/1050927,前3名(通过投票)应该有帮助 – Prisoner

+0

直到所有接口引用被释放后,Excel才能退出。当垃圾收集器运行时会发生这种情况,就像您的vb.net应用继续执行有用的工作时一样。或者当你关闭它。所以一个粗略的诊断是你的vb.net应用程序不再做任何有用的事情。是的,你可以退出它。或者如果想要强制它,则调用GC.Collect。但是,请注意放置它的位置,它应该放在调用此方法的代码中,或者在调试时不会执行此任务。 –

+0

谢谢@HansPassant您的评论。我应该添加一些更多的细节......发布的代码是最终成为DLL一部分的类的一部分。该DLL将被组装成一个SQL SERVER函数,由存储过程调用,因此不能从调用过程中调用GC。意思是,整个事情必须在DLL中独立。另外一个观察:当在调试和手动循环下运行时,Excel实例出现,但是在某些时候,它们消失了(例如,达到7并触发第8个时,只剩下一个)。 – FDavidov

回答

0

下面的代码对我的作品:

wb.Close() 
excel.Quit() 

releaseObject(excel) 
releaseObject(wb) 
releaseObject(ws) 

电话表上,工作簿和Excel应用程序有以下功能:

Private Sub releaseObject(ByVal obj As Object) 
    Try 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

http://vb.net-informations.com/excel-2007/vb.net_excel_2007_open_file.htm

+0

谢谢@Renzapuddia您的建议。 isaw类似的东西,但有错误(具体来说,'GC'是未知的)。不过,会尝试并让你知道。 – FDavidov

+0

@FDavidov如果你有'GC'的问题,那么你可能需要一个'Imports'语句和/或添加一个对你的项目的引用。 – Craig