【发布时间】:2018-03-17 07:17:57
【问题描述】:
我有一个 C# ExcelDna XLL 函数库,我在启动期间从 VSTO 加载项注册。
this.Application.RegisterXLL(xllPath);
当我执行一个 Excel 文件(Process.Start.xlsx 文件)时,大多数情况下一切正常,并且在工作簿打开时评估函数。
以这种方式打开工作簿时,Excel 会重用当前正在运行的EXCEL.EXE 进程(如果存在)。大多数时候这很好,但在某些情况下,例如,如果 Excel 通过 COM 打开然后关闭,那么当 Excel 实例关闭时,它并没有真正关闭,而是关闭了所有它的加载项和注销所有XLLs 但仍然存在。当进程调用这些僵尸进程之一时,这些函数显然不再计算。
为了解决这个问题,我尝试直接打开 Excel,使用 .xlsx 文件作为命令行参数,但在这种情况下,似乎存在某种竞争条件,工作簿在 @987654332 之前打开@ 已完成注册,函数始终评估为 #NAME。如果单元格被修改并重新评估,则函数正确评估。调用 Application.CalculateFull() 和所有可能的变化都没有效果。
如果我通过资源管理器打开一个文件(即双击它)然后奇怪的是它现在返回 #N\A 而不是 #NAME 但仍然是同样的问题。
我什至尝试注册XLL,以便它在启动时加载 (see here),但仍然无法正常工作。
有没有其他人遇到过这种情况并找到了一种可靠的方法来获取XLL 函数以在打开 Excel 实例时进行评估?
【问题讨论】:
-
"当 Excel 实例关闭时,它并没有真正关闭" ,我相信这是您需要关注的唯一问题。当通过 COM 打开 Excel 时,您是否致电
workbook.close()和excel.Quit()?你不应该得到一个僵尸 Excel 实例。 -
如果是我打开了 COM 实例,那就没问题了。问题是任何人都可以留下一个悬空的 COM 实例。
-
好的,那么也许您可以尝试使用
/x开关启动 Excel(以获取新实例)。 support.office.com/en-us/article/… -
试过了。 “尝试……”