C# 作为集成测试的一部分,为已安装的ExcelDna加载项调用Excel功能区按钮
我正在尝试为使用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是一个通用应用程序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
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的一部分。