此 C# 代码位于 .NET 4.5 中ComVisible
集会:
C# Code
[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 Code
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
在后期绑定模式下工作,但显然,以丢失打字为代价,因此在 VBA 中丢失自动完成(IntelliSense),这在我的场景中是不可接受的。
我在示例中关心的行如下:
oComExposedEarlyBinding.DoubleArray = VBArray
oComExposedEarlyBinding.ObjectArray = VBArray
oComExposedEarlyBinding.PlainObject = VBArray
让上面三行中的任何一行工作都可以满足我的需要,那么您是否有任何解决方法或解决方案可以使这项工作正常进行(请注意,我对将数组作为参数传递给函数不感兴趣)?
Update:将这个问题提交给微软的支持后,等待了近三周。他们确认这是一个错误,这是知识库:https://web.archive.org/web/20140531181434/http://support.microsoft.com/kb/327084 https://web.archive.org/web/20140531181434/http://support.microsoft.com/kb/327084C# 中唯一的解决方法是下面标记的解决方案。
但是,我可以确认如果用 C++/CLI 编写此代码,它可以按预期工作。