c# - 作为集成测试的一部分,为已安装的 ExcelDna 插件调用 Excel 功能区按钮

标签 c# excel office365 vsto excel-dna

我正在尝试为使用 ExcelDna 和 VSTO 自动化开发的 Excel 插件创建集成测试。我想测试我们应用程序的不同功能,但需要将 CommandBar 用于我们的插件命令栏。

我正在尝试使用 Microsoft.Office.Interop.Excel 引用和 RegisterXLL 方法在 Excel 中注册 XLL。

我正在尝试在安装了 Office 365 的 Windows 10 机器上创建测试。

我遇到了几个问题,其中有许多可能已过时的帖子。

最初,我实例化了 Excel 应用程序,注册了插件,并尝试使用 Microsoft.Office.Interop.Excel.SendKeys 将击键发送到 Excel 实例。虽然我最初能够在使用断点调试测试时让它工作,但在运行测试时它不起作用。有多个帖子表明,在 Windows 10 上,Office 现在是一个通用应用程序,并且 SendKeys 将不再工作,因为它违反了 UAC 并且用于将 key 发送到应用程序的 Win32 API 调用同样不起作用,因为 Office 是一个通用应用程序。

我的第二次尝试是尝试通过 VSTO 自动化代码调用命令栏及其菜单项,但我似乎找不到任何说明如何在不同的应用程序域中调用命令栏功能的帖子。

此外,当我关闭 Excel 实例时,我注意到始终有一个 Excel 进程正在运行,即使下面的代码正在用于终止 Excel 应用程序。

    void CloseApp()
    {
        xlApp.Quit();
        xlApp = null;

        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

我对如何实现这一点感到困惑。有没有人可以指出任何帖子可以解决这些仍然有效的问题?

最佳答案

关于关闭,您可能希望将代码与 GC 调用中的 COM 调用分开,以确保调试器不会使局部变量保持事件状态(并防止 GC 运行和释放 COM 对象。所以你要遵循这个图案:

using System;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

namespace TestCsCom
{
    class Program
    {
        static void Main(string[] args)
        {
            // NOTE: Don't call Excel objects in here... 
            //       Debugger would keep alive until end, preventing GC cleanup

            // Call a separate function that talks to Excel
            DoTheWork();

            // Now let the GC clean up (repeat, until no more)
            do
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            while (Marshal.AreComObjectsAvailableForCleanup());
        }

        static void DoTheWork()
        {
            Application app = new Application();
            Workbook book = app.Workbooks.Add();
            Worksheet worksheet = book.Worksheets["Sheet1"];
            app.Visible = true;
            for (int i = 1; i <= 10; i++) {
                worksheet.Cells.Range["A" + i].Value = "Hello";
            }
            book.Save();
            book.Close();
            app.Quit();

            // NOTE: No calls the Marshal.ReleaseComObject() are ever needed
        }
    }
}

关于c# - 作为集成测试的一部分,为已安装的 ExcelDna 插件调用 Excel 功能区按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524925/

相关文章:

c# - .NET 中的嵌入式 Web 服务器

c# - 如何对某些 StyleCop 规则进行异常(exception)处理?

c# - 为什么这个 lambda 表达式对构造函数参数有效

excel - 在类模块内创建公共(public) VB 数组

azure - AzureAD 应用程序如何撤销自己的同意? (删除委托(delegate)或应用程序权限)

python - Office 365 'app only' token 请求失败,出现 'invalid signature' 错误

c# - WCF - 来自另一个程序集的服务契约(Contract)

excel - 使用 VBA 将 Sum 与 CountIfs 一起使用

excel - 如何检查Excel-VBA中某些工作表是否存在?

javascript - 我需要通过office.js删除word消息