Excel Interop 在 STA 线程中实例化跨单元代理

Excel Interop instantiates cross apartment proxy in STA thread

根据我对 .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.

正如 Simon 在评论中回复的那样,Excel 运行s 在一个单独的进程中,代码的“新应用程序”部分将始终提供代理 - 无论是什么 theading 模型。

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

感谢所有参与者!