Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为集成测试的一部分,为已安装的ExcelDna加载项调用Excel功能区按钮_C#_Excel_Office365_Vsto_Excel Dna - Fatal编程技术网

C# 作为集成测试的一部分,为已安装的ExcelDna加载项调用Excel功能区按钮

C# 作为集成测试的一部分,为已安装的ExcelDna加载项调用Excel功能区按钮,c#,excel,office365,vsto,excel-dna,C#,Excel,Office365,Vsto,Excel Dna,我正在尝试为使用ExcelDna和VSTO自动化开发的Excel加载项创建集成测试。我想测试应用程序的不同功能,但需要为我们的addins CommandBar使用CommandBar 我正在尝试使用Microsoft.Office.Interop.Excel引用和RegisterXLL方法在Excel中注册XLL 我正在尝试在安装了Office 365的Windows 10设备上创建测试 有几个问题,我有很多潜在的过时的职位上 最初,我实例化了Excel应用程序,注册了加载项,并尝试使用Mic

我正在尝试为使用ExcelDna和VSTO自动化开发的Excel加载项创建集成测试。我想测试应用程序的不同功能,但需要为我们的addins CommandBar使用CommandBar

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

我正在尝试在安装了Office 365的Windows 10设备上创建测试

有几个问题,我有很多潜在的过时的职位上

最初,我实例化了Excel应用程序,注册了加载项,并尝试使用Microsoft.Office.Interop.Excel.SendKeys将击键发送到Excel实例。虽然我最初能够在使用断点调试测试时使其工作,但在运行测试时它不工作。有多篇文章指出,在Windows 10上,Office现在是一个通用应用程序,SendKeys将不再工作,因为它违反了UAC,而且Win32 API调用向应用程序发送密钥也同样不起作用,因为Office是一个通用应用程序

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

        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
我的第二次尝试是尝试通过VSTO自动化代码调用Commandbar及其菜单项,但我似乎找不到任何说明如何在不同的应用程序域中调用Commandbar函数的帖子

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

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

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

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

关于关闭,您可能希望将带有COM调用的代码从GC调用中分离出来,以确保调试器不会使局部变量保持活动状态(并阻止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
        }
    }
}
使用系统;
使用System.Runtime.InteropServices;
使用Microsoft.Office.Interop.Excel;
命名空间TestCsCom
{
班级计划
{
静态void Main(字符串[]参数)
{
//注意:不要在此处调用Excel对象。。。
//调试器将一直保持活动状态,直到结束,从而阻止GC清理
//调用与Excel对话的单独函数
DoTheWork();
//现在让GC清理(重复,直到不再清理)
做
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
while(Marshal.AreComObjectsAvailableForCleanup());
}
静态void DoTheWork()
{
应用程序app=新应用程序();
工作簿=app.Workbooks.Add();
工作表=书本工作表[“Sheet1”];
app.Visible=true;

对于(int i=1;我感谢Govert。我重新构造了setup和teardown方法,并分别处理实例化和处置。这消除了我遇到的重影问题。现在我只需要一种方法,从实例化的互操作跨域调用Excel中的功能区按钮,该按钮是已注册XLL的一部分。