У меня есть следующий интерфейс для определения класса .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, как и ожидалось. Однако в последней строке я получил сообщение об ошибке «Требуется объект».
Почему установка значения с помощью метода set работает, но установка через свойство не удалась? Что мне нужно изменить, чтобы имущество работало должным образом?
Редактировать: у меня было несколько полезных ответов, поэтому мой дополнительный вопрос «возникнет ли эта проблема с COM-клиентами, написанными на других языках, или это специфично для VBA?».