Этот C# код в сборе .NET 4.5 ComVisible
:C# свойство подвергается VBA (COM): Ошибка выполнения '424': Требуется объект
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 32bit 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 и ожидания почти трех недель. Они подтвердили, что это ошибка, и это KB: http://support.microsoft.com/kb/327084, и единственным обходным решением в C# является то, что помечено как решение ниже. Однако я могу подтвердить, что этот код работает так, как ожидалось, если он написан на C++/CLI.
Массив VBA, должно быть, нижняя граница 0, чтобы быть совместимым с C# массива. –
Я передавал массивы в виде функциональных параметров от COM до .NET, а затем преобразовывал их в нуль в .NET.Вы говорите, что из-за этой проблемы вышеописанный код не работает? – Adam