我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.
我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?
这是关于如何在c#中正确清理excel互操作对象的后续问题 .
gyst是在Excel命名空间内使用链接调用(例如ExcelObject.Foo.Bar())来防止COM对象的垃圾收集.相反,应该显式创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式释放它们.
是否仅在特定于Excel COM对象的链式调用后释放COM对象的行为?每当使用COM对象时,应用这种模式是否过度?
另外你好,
我正在通过C#中的Interop进行Excel自动化,我希望在工作簿关闭时得到通知.但是,工作簿上没有Close事件,也没有应用程序上的Quit事件.
以前有人这样做过吗?如何编写一段代码来响应正在关闭的工作簿(只有在工作簿真正关闭时才会执行)?理想情况下,这应该在关闭工作簿后发生,因此我可以依赖该文件来反映所有更改.
到目前为止我发现的细节:
有一个BeforeClose()事件,但是如果有未保存的更改,则在询问用户是否保存它们之前引发此事件,所以目前我可以处理该事件,我没有最终文件而且我无法发布COM对象,这两件事我都需要/做.我甚至不知道工作簿是否会实际关闭,因为用户可能会选择中止关闭.
然后有一个BeforeSave()事件.因此,如果用户选择"是"来保存未保存的更改,则在 BeforeClose()之后执行BeforeSave().但是,如果用户选择"中止",然后点击"文件 - >保存",则执行完全相同的事件顺序.此外,如果用户选择"否",则根本不执行BeforeSave().只要用户没有单击任何这些选项,同样适用.
我有一个Visual Basic .NET程序,需要打开和关闭Excel电子表格.打开和阅读电子表格工作正常,但尝试关闭Excel 2007应用程序会导致它挂起.它似乎关闭,但如果你查看任务管理器,应用程序仍在运行.我用来关闭它的代码是
wbkData.Close(saveChanges:=False)
appExcel.Quit()
wbkData = Nothing
appExcel = Nothing
Run Code Online (Sandbox Code Playgroud)
如何让Excel正常关闭?