Excel Interop实例化STA线程中的交叉单元代理

问题描述

据我从.NET中的单元了解,当我们在STA线程内创建单元线程的COM对象时,我们应该获得对真实对象的引用,而不是跨部门代理。

[TestMethod]
Public void ExcelShouldNotBeMarshalled()
{
     var excelApp = new Microsoft.Office.Interop.Excel.Application();
     if (excelApp is IMarshal)
         throw new Exception(“Should not be a proxy as we are running this in a STA and registry ThreadingModel is empty”);
}

我无法使其与我尝试的ThreadingModel的任何组合一起使用。

我有什么想念的吗?

为什么代理对我不利?我希望我的测试尽可能接近真实应用。当应用程序作为Excel加载项运行时,我会获得非代理引用,并且一切正常运行,但是在测试中,事件回调确实会抽至随机MTA线程,而不是抽回UI Thead中。

解决方法

正如西蒙在评论中回答的那样,Excel在一个单独的过程中运行,并且代码的“新应用程序”部分将始终提供代理-无论使用哪种主播模型。

为避免代理对象并像在生产中一样运行测试,Joseph在注释中建议使用VBA调用.Net方法来运行测试。我发现它很合适,因此我使用xUnit功能实现了自定义测试执行并处理调用我的测试方法的VBA。它可以解决我与代理相关的问题,并且可以提高测试速度。

感谢所有参与人员!