我已经定义了以下接口,将一个.NET类暴露给COM:
[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,与预期相同。然而,在最后一行出现了“Object required”运行时错误。
为什么通过setter方法设置值可以工作,但通过属性设置失败?我需要改变什么才能让属性按预期工作?
编辑:我已经得到了一些有用的回复,因此我的额外问题是“这个问题是否会在其他语言编写的COM客户端中出现,还是只限于VBA?”