我最近尝试将旧版VB6应用程序移植到.NET。它并不是一个完整的端口,但我只关注应用层。我还在消耗一些VB6 COM组件。
到目前为止一直很好,但我最近碰壁了。
我需要将自定义集合从.NET传递给VB6。这可能吗?
我在.NET上调用的COM方法期待一个通用对象,但是应用程序立即爆炸:InvalidCastException - 指定的Cast无效。
我偶然发现了一些文章暗示如何将VB6集合传递给.NET而不是相反。我尝试在.NET中继承/利用一些不同的集合类型,但到目前为止都无济于事。任何帮助表示赞赏。
答案 0 :(得分:1)
在.NET集合类实现的COM接口声明中,将返回枚举数的方法的DispId设置为-4。调用该方法“GetEnumerator”。
另一方面,如果您实际上想要模拟VBA.Collection对象,而不仅仅是在VB6中支持For Each,则可以在VB.NET类库中设置对VBA类型库的引用(假设你正在创建一个类库)并在你的VB.NET类中实现_Collection。
<Guid("A4C4671C-499F-101B-BB78-00AA00383CBB")>
<ComDefaultInterface(GetType(_Collection))>
<ComVisible(False)>
Public Class VBACollection
Implements _Collection
.
.
.
End Class
然后只需实现_Collection接口。如果VB.NET不喜欢接口名称中的下划线,则可能需要将其转义。