【发布时间】:2021-08-20 14:40:54
【问题描述】:
我正在开发一个 VSTO 加载项,它在当前工作簿上调用 Microsoft.Office.Interop.Excel.Workbook.Close 方法,以允许另一个进程在该文件上写入。
如果文件存储在本地,则该方法有效地关闭工作簿并从锁定文件的 EXCEL.EXE 中释放句柄。
但是,当文件保存在 OneDrive 上时,Close 方法似乎不起作用。那是一个错误吗?有什么想法吗?
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
}
void Application_WorkbookOpen(Excel.Workbook Wb)
{
Wb.Close(); // doesn't work for oneDrive files ?!
}
【问题讨论】:
-
如果您在
Close之后等待/睡眠 10 秒,这会改变什么吗?作为用户,我注意到 OneDrive 同步似乎需要额外的时间...... -
我尝试在使用 Thread.Sleep(10000) 关闭前后等待 10 秒,但没有结果。句柄仍然存在,并且工作簿不会关闭。该文件仍由 EXCEL.EXE 持有
-
是的,您可能需要设置一个计时器或在单独的线程中休眠,以便活动线程可以泵送窗口消息,最终一切都可以关闭。 SysInternals 曾经有一个名为“handle.exe”(或者可能是 Win SDK?)的实用程序,它可以提供打开的句柄?如果你只是打电话给
Close()然后等待,句柄最终会关闭吗???在活动线程上调用睡眠可能不会给进程时间来关闭事物,因为活动线程上的睡眠会停止一切。只是想法...... -
好主意!我使用handle.exe 来验证关闭的块。它确实是 Excel 本身。因此,使用新线程是解决方案的一部分。好像不需要 Thread.Sleep ,也可能是句柄在主线程中存活了这么短的时间。
标签: c# excel com vsto excel-addins