我想通过COM互操作发布一个C#类库,以便VB6客户端可以使用它。为了演示,考虑以下代码片段:
在将库注册到系统后,COM接口可以在VB6中使用。但是,使用索引值访问数组属性似乎不起作用:
我发现唯一的替代方法是创建一个临时数组变量。这样可以正确地访问索引接口:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace cslib
{
[ComVisible(true)]
[Guid("...")]
public interface IClass2
{
string m_sStr { get; set; }
}
[ComVisible(true)]
[Guid("...")]
[ClassInterface(ClassInterfaceType.None)]
public class Class2 : IClass2
{
public Class2()
{
m_sStr = "Hello";
}
public string m_sStr { get; set; }
}
[ComVisible(true)]
[Guid("...")]
public interface IClass1
{
Class2[] m_Class2Instances { get; set; }
}
[ComVisible(true)]
[Guid("...")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IClass1
{
public Class1()
{
List<Class2> lstClass2 = new List<Class2>();
for (int i = 0; i < 5; i++)
lstClass2.Add(new Class2());
m_Class2Instances = lstClass2.ToArray();
}
public Class2[] m_Class2Instances { get; set; }
}
}
在将库注册到系统后,COM接口可以在VB6中使用。但是,使用索引值访问数组属性似乎不起作用:
Dim c1 As New cslib.Class1
Dim str As String
'Error message = Wrong number of arguments or invalid property assignment
str = c1.m_Class2Instances(0).m_sStr
我发现唯一的替代方法是创建一个临时数组变量。这样可以正确地访问索引接口:
Dim c1 As New cslib.Class1
Dim str As String
'Works, but requires detour via temp array
Dim arrc2() As cslib.Class2
arrc2 = c1.m_Class2Instances
str = arrc2(0).m_sStr
很不幸,我在这里所示的数组只是一个简化版。在现实生活中,我需要访问位于嵌套数组结构深处的COM接口。例如,以下类结构...
Class1
Class2[]
Class3[]
Class4[]
...最终强制我创建三个临时数组变量,才能真正访问Class4的实例。
这是VB6的限制吗?如果是,有没有办法在不用大量临时变量的情况下访问嵌套数组接口?
this
属性将导致一个模糊的符号。 - Aurorastr = c1.m_Class2Instances()(0).m_sStr
是可以工作的,而str = c1.m_Class2Instances()(0).m_Class3Instances()(0).m_sStr
会导致语法错误。 - Aurora