【发布时间】:2010-03-30 19:30:07
【问题描述】:
我定义了以下接口来向 COM 公开 .NET 类:
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("6A983BCC-5C83-4b30-8400-690763939659")]
[ComVisible(true)]
public interface IComClass
{
object Value { get; set; }
object GetValue();
void SetValue(object value);
}
这个接口的实现很简单:
[ClassInterface(ClassInterfaceType.None)]
[Guid("66D0490F-718A-4722-8425-606A6C999B82")]
[ComVisible(true)]
public class ComClass : IComClass
{
private object _value = 123.456;
public object Value
{
get
{
return this._value;
}
set
{
this._value = value;
}
}
public object GetValue()
{
return this._value;
}
public void SetValue(object value)
{
this._value = value;
}
}
然后我使用 RegAsm 注册了它,并尝试通过以下代码从 Excel 中调用它:
Public Sub ComInterop()
Dim cc As ComClass
Set cc = New ComClass
cc.SetValue (555.555)
valueByGetter = cc.GetValue
valueByProperty = cc.Value
cc.Value = 555.555
End Sub
当我单步执行此代码时,valueByGetter = 555.5555 和 valueByProperty = 555.555 符合预期。但是,我在最后一行收到“需要对象”运行时错误。
为什么通过setter方法设置值有效,但通过属性设置失败?我必须进行哪些更改才能使该属性按预期工作?
编辑:我收到了一些有用的回复,所以我的另一个问题是“这个问题会出现在用其他语言编写的 COM 客户端,还是特定于 VBA?”。
【问题讨论】:
-
您是否尝试过将调试器附加到 excel 进程并介入并查看它到底在哪里爆炸?
-
不确定您指的是哪个调试器。如果我通过将 excel 作为外部程序启动来通过 VS.Net 调试 .net 代码,我不会到达 Value 属性的 set 部分中的断点,这表明这是一个 excel 问题。如果您的意思是直接调试excel,我不知道从哪里开始-您能给我更多信息吗?谢谢。