为什么GetObject方法失败?

问题描述 投票:0回答:1

我有一个在 Visual Studio 中构建的 VSTO 应用程序,它运行此代码块:

using MSP = Microsoft.Office.Interop.MSProject;
using VB = Microsoft.VisualBasic;

if (IsMSProjectIsOpen())
{
     pApp = (MSP.Application)VB.Interaction.GetObject(Class: "MSProject.Application");
}
else
{
     pApp = CreateMSProjectApp();
}

这一直有效,但今天由于某种原因在我的一台用户计算机上失败了。

我使用 Microsoft Project VBA 编辑器在那台计算机上运行了测试,尝试使用 GetObject 方法设置 Application 对象:

Sub Test()

    Dim app As MSProject.Application
    
    Set app = GetObject(Class:="MSProject.Application")

End Sub

通常应用程序对象会设置得很好,在本地窗口中看起来像这样:

出于某种原因,我正在使用完全相同的代码测试的计算机设置了应用程序对象,因此它不为空,但是当您在本地窗口中展开节点时,它会显示No Variables

当您尝试访问它的任何属性或方法时,它会抛出错误:

这是怎么回事?

vba ms-project office-automation
1个回答
0
投票

呼叫被被叫方拒绝

Office 消息泵检索消息并将其分派到隐藏的 OLE 窗口,在该窗口中取消编组并执行调用。但是,在执行调用之前,COM 首先与 Office 进行检查,以确保它确实能够处理该调用。在某些情况下,调用可能会导致不希望的重入情况(例如,当 Office 处于模式状态或处于转换等长时间操作期间)。在这些情况下,Office 可以告诉 COM 它太忙而无法处理呼叫,在这种情况下,

RPC_E_CALL_REJECTED
将返回给呼叫者。在您的情况下,COM 互操作将失败转换为异常。

为了解决这个问题,Microsoft 建议禁用 COM 加载项。

是的,我正在尝试在引用 Microsoft.VisualBasic.Interaction.GetObject 方法的 C# 编写的应用程序中使用 GetObject 方法。

请注意,当两个应用程序在 Windows 中的不同安全上下文下运行时,您将无法连接到正在运行的实例。您的选择是在相同的安全上下文下创建一个新实例,然后将其自动化。

© www.soinside.com 2019 - 2024. All rights reserved.