【发布时间】:2011-05-07 22:32:45
【问题描述】:
给定:
- VSTO 插件
-
override object RequestComAddInAutomationService()返回一个在我的场景中称为Facade的类的实例。 - Excel 2007 中的 VBA 宏,它访问
AddIn.Object以获取 Facade 并使用它。 - 很多时候它都可以正常工作。
- 有几次出乎意料,这似乎不起作用。
更新:原来是某个特定用户有问题。她一直都有,其他人从来没有(?永远不要说“从不”)
在这“几次”中,我得到了
错误:对象变量或未设置块变量
在尝试访问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。每当在 Nothing 的引用上执行方法时,VBA 都会抛出这种类型的错误,在我的例子中是 automationObject。
另一方面,如果加载项根本不存在,Application.COMAddIns(...) 会引发 index out of bounds 错误,我以前见过。
【问题讨论】:
标签: c# vba .net-3.5 vsto excel-2007