【发布时间】:2019-05-05 03:53:42
【问题描述】:
我正在用 C# 编写许多 Office 插件,我喜欢所有可以扩展 Excel 功能的绝妙方法。但一直困扰着我的一件事是对几乎任何 Office 对象执行几乎任何操作的开销。
我知道有一些高级技巧可以更快地完成许多事情,例如读取和写入 object[,] 数组到更大的单元格范围,而不是访问单个单元格,等等。但无论如何,一个复杂的加载项最终总是会访问许多不同的对象,或者是几个对象的许多属性,或者一遍又一遍地访问相同的属性。
在分析我的加载项时,我总是发现我至少花费了 90% 的 CPU 时间来访问 Office 对象的基本属性。例如,这是我用来检查窗口是否已滚动的一些代码,因此我可以相应地更新一些叠加图形:
Excel.Window window = Globals.ThisAddIn.Application.ActiveWindow;
if (window.ScrollColumn != previousScrollColumn)
{
needsRedraw = true;
previousScrollColumn = window.ScrollColumn;
}
if (window.ScrollRow != previousScrollRow)
{
needsRedraw = true;
previousScrollRow = window.ScrollRow;
}
if (window.Zoom != previousZoom)
{
needsRedraw = true;
previousZoom = window.Zoom;
}
第一行,获取活动窗口,以及每个 if 语句,每个访问该窗口的属性,都在分析时亮起。他们真的很慢。
现在我知道这些是托管包装器中的 COM 对象,并且存在某种托管->非托管接口的东西,可能是进程间通信等等,所以我对有一些开销并不感到惊讶,但我我仍然对它加起来的数量感到惊讶。
那么有什么技巧可以加快这样的速度吗?
例如,在上述情况下,我正在访问同一个对象的三个属性。我不禁想到必须有某种方法可以一口气读完它们,比如通过原生伴侣插件或其他什么...?
有什么想法吗?
【问题讨论】:
标签: c# excel com vsto excel-addins