相关疑难解决方法(0)

如何正确清理Excel互操作对象?

我在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 interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

如何在C#中正确清理互操作对象

这是关于如何在c#中正确清理excel互操作对象的后续问题 .

gyst是在Excel命名空间内使用链接调用(例如ExcelObject.Foo.Bar())来防止COM对象的垃圾收集.相反,应该显式创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式释放它们.

是否仅在特定于Excel COM对象的链式调用后释放COM对象的行为?每当使用COM对象时,应用这种模式是否过度?

c# excel interop garbage-collection com-interop

5
推荐指数
1
解决办法
1833
查看次数

Excel自动化:缺少关闭事件

另外你好,

我正在通过C#中的Interop进行Excel自动化,我希望在工作簿关闭时得到通知.但是,工作簿上没有Close事件,也没有应用程序上的Quit事件.

以前有人这样做过吗?如何编写一段代码来响应正在关闭的工作簿(只有在工作簿真正关闭时才会执行)?理想情况下,这应该关闭工作簿发生,因此我可以依赖该文件来反映所有更改.

到目前为止我发现的细节:

有一个BeforeClose()事件,但是如果有未保存的更改,则在询问用户是否保存它们之前引发此事件,所以目前我可以处理该事件,我没有最终文件而且我无法发布COM对象,这两件事我都需要/做.我甚至不知道工作簿是否会实际关闭,因为用户可能会选择中止关闭.

然后有一个BeforeSave()事件.因此,如果用户选择"是"来保存未保存的更改,则 BeforeClose()之后执行BeforeSave().但是,如果用户选择"中止",然后点击"文件 - >保存",则执行完全相同的事件顺序.此外,如果用户选择"否",则根本不执行BeforeSave().只要用户没有单击任何这些选项,同样适用.

c# excel events interop

5
推荐指数
1
解决办法
3620
查看次数

通过.NET关闭时Excel 2007挂起

我有一个Visual Basic .NET程序,需要打开和关闭Excel电子表格.打开和阅读电子表格工作正常,但尝试关闭Excel 2007应用程序会导致它挂起.它似乎关闭,但如果你查看任务管理器,应用程序仍在运行.我用来关闭它的代码是

wbkData.Close(saveChanges:=False)
appExcel.Quit()
wbkData = Nothing
appExcel = Nothing
Run Code Online (Sandbox Code Playgroud)

如何让Excel正常关闭?

.net vb.net excel

1
推荐指数
1
解决办法
2469
查看次数

标签 统计

excel ×4

c# ×3

interop ×3

com-interop ×2

.net ×1

events ×1

garbage-collection ×1

vb.net ×1