Свойство C #, доступное для VBA (COM): ошибка времени выполнения '424': требуется объект

Этот код C # находится в .NET 4.5ComVisible монтаж:

Код C #
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("22341123-9264-12AB-C1A4-B4F112014C31")]
public interface IComExposed
{
    double[] DoubleArray { get; set; }
    object[] ObjectArray { get; set; }
    object PlainObject { get; set; }
    double ScalarDouble { get; set; }
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("E4F27EA4-1932-2186-1234-111CF2722C42")]
[ProgId("ComExposed")]
public class ComExposed : IComExposed
{
    public double[] DoubleArray { get; set; }
    public object[] ObjectArray { get; set; }
    public object PlainObject { get; set; }
    public double ScalarDouble { get; set; }
}

Из Excel 2010 32-битный VBA, ямы получили следующее поведение:

Код VBA
Dim VBArray(1 To 3) As Double
VBArray(1) = 1
VBArray(2) = 2
VBArray(3) = 3

Dim oComExposedEarlyBinding As New ComExposed

' Works
oComExposedEarlyBinding.ScalarDouble = 5

' Compile Error: Function or interface marked as restricted,
' or the function uses an Automation type not supported in Visual Basic
oComExposedEarlyBinding.DoubleArray = VBArray

' Compile Error: Function or interface marked as restricted,
' or the function uses an Automation type not supported in Visual Basic
oComExposedEarlyBinding.ObjectArray = VBArray

' Run-time error '424': Object required
oComExposedEarlyBinding.PlainObject = VBArray

' Run-time error '424': Object required
oComExposedEarlyBinding.PlainObject = 5

Dim oComExposedLateBinding As Variant
Set oComExposedLateBinding = New ComExposed

' Works
oComExposedLateBinding.ScalarDouble = 5

' Run-time error '5': Invalid procedure call or argument
oComExposedLateBinding.DoubleArray = VBArray

' Run-time error '13':  Type mismatch
oComExposedLateBinding.ObjectArray = VBArray

' Works
oComExposedLateBinding.PlainObject = VBArray

' Works
oComExposedLateBinding.PlainObject = 5

Как и ты'мы заметилиPlainObject работает в режиме позднего связывания, но, очевидно, за счет потери печати и, следовательно, потери автоматического завершения (IntelliSense) в VBA, что неприемлемо в моем сценарии.

Строки, которые мне нужны в моем примере, следующие:

oComExposedEarlyBinding.DoubleArray = VBArray
oComExposedEarlyBinding.ObjectArray = VBArray
oComExposedEarlyBinding.PlainObject = VBArray

Выполнение любой из трех приведенных выше строк удовлетворит мою потребность, поэтому у вас есть обходной путь или решение, которое бы помогло бы выполнить эту работу (обратите внимание, что я не заинтересован в передаче массива в качестве параметра функции)?

Обновить: После отправки этого вопроса в MicrosoftПоддерживаю и жду почти три недели. Они подтвердили, что это ошибка, и это КБ:http://support.microsoft.com/kb/327084 и единственный обходной путь в C # - это то, что помечено как решение ниже. Тем не менее, я могу подтвердить, что этот код работает должным образом, если он написан на C ++ / CLI.

Ответы на вопрос(2)

Ваш ответ на вопрос