给出:
最后一行是出现错误的地方。虽然调用的方法返回一个对象,但我的确确定它不能是错误的源头:如果返回的引用是null,那么这个语句只会被计算成“Set oResult = Nothing”,这仍然是有效的。在我的情况下,VBA会在执行一个空引用(即automationObject)上的方法时抛出此类型的错误。
另一方面,如果插件根本不存在,"Application.COMAddIns(...)" 会引发索引超出范围的错误,我之前见过这种情况。
- 一个VSTO插件
- 一个
override object RequestComAddInAutomationService()
,该方法返回一个名为Facade
的类的实例。 - 一个在Excel 2007中的VBA宏,用于访问
AddIn.Object
以获取Facade并使用它。 - 许多次这一切都能正常工作。
- 几次突然之间就不能正常工作了。
更新:原来仅有特定用户遇到了这个问题。她总是有这个问题,其他人从未遇到过(?不要说“从未”)
我得到了以下错误信息:
错误:对象变量或With块变量未设置
错误发生在试图访问Facade
属性的代码行上。简而言之,我可以告诉你,在RequestComAddInAutomationService()
方法中的代码没有任何容易出错的魔法,用于访问插件的VBA代码也从网上找到,看起来也没问题。更详细的版本将在稍后提供给那些愿意花时间阅读的人 :-)
问题:有人知道为什么会出现这种情况吗? 是Excel的问题吗?
承诺的细节:
MyAddIn.cs:
public partial class MyAddIn
{
public Facade Facade { get; private set; }
protected override object RequestComAddInAutomationService()
{
if (this.Facade == null)
this.Facade = new Facade(Controller.Instance);
return this.Facade;
}
}
Facade.cs:
[ComVisible(true)]
[Guid("1972781C-A71A-48cd-9675-AE47EACE95E8")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IFacade
{
// some methods
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Facade : IFacade
{
private Controller Controller { get; set; }
public Facade(Controller controller)
{
this.Controller = controller;
}
}
Facade
有一些方法但没有单个字段。
Controller.cs:
public class Controller
{
private static Controller instance = null;
public static Controller Instance
{
get
{
if (instance == null) instance = new Controller();
return instance;
}
}
private Controller() { }
}
Controller
有一些私有字段。由于这些字段的赋值是在创建时执行的,因此我进行了审查。它们中的大部分根本没有初始化,或者被设置为null
,因此构造函数几乎什么也没做。
VBA代码:
Dim addin As Office.COMAddIn
Dim automationObject As Object
Set addin = Application.COMAddIns("My AddIn")
Set automationObject = addin.Object
Dim oResult As Object
Set oResult = automationObject.SomeMethodThatReturnsAnObject()
最后一行是出现错误的地方。虽然调用的方法返回一个对象,但我的确确定它不能是错误的源头:如果返回的引用是null,那么这个语句只会被计算成“Set oResult = Nothing”,这仍然是有效的。在我的情况下,VBA会在执行一个空引用(即automationObject)上的方法时抛出此类型的错误。
另一方面,如果插件根本不存在,"Application.COMAddIns(...)" 会引发索引超出范围的错误,我之前见过这种情况。