Given:
- VSTO 插件
- An
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;
}
}
门面.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
有一些方法,但没有一个字段。
控制器.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 都会抛出此类错误Nothing
,即automationObject
就我而言。
另一方面,如果加载项根本不存在,Application.COMAddIns(...)
会提出一个索引越界错误,我以前见过。