.net 如何在c中创建VBA.Collection()对象#

.net 如何在c中创建VBA.Collection()对象#,.net,vba,c#-4.0,excel,.net,Vba,C# 4.0,Excel,我需要从C#code创建互操作VBA.Collection对象 我在项目中引用了Interop.VBA 当我这么说的时候: var col = new VBA.Collection() 在运行时,我遇到一个错误,说dll没有注册… 我发现: 它可能会工作,但我的机器上没有VB6编译器。 我想知道您是否知道其他解决方法(或者可能有人可以为我编译此ActiveX?我还没有尝试过,但它可能会奏效 为VB6的VBA6.dll创建导入库。创建自己的_集合接口实现。使用此实现代替VBA.Collectio

我需要从C#code创建互操作VBA.Collection对象
我在项目中引用了Interop.VBA

当我这么说的时候:

var col = new VBA.Collection()
在运行时,我遇到一个错误,说dll没有注册…
我发现:

它可能会工作,但我的机器上没有VB6编译器。

我想知道您是否知道其他解决方法(或者可能有人可以为我编译此ActiveX?

我还没有尝试过,但它可能会奏效

为VB6的VBA6.dll创建导入库。创建自己的_集合接口实现。使用此实现代替VBA.Collection类

class MyCollection : VBA._Collection
{
    private Dictionary<object, object> _items = new Dictionary<object, object>();

    public void Add(ref object Item, [System.Runtime.InteropServices.OptionalAttribute]ref object Key, [System.Runtime.InteropServices.OptionalAttribute]ref object Before, [System.Runtime.InteropServices.OptionalAttribute]ref object After)
    {
        // Ignoring the Before and After params for simplicity
        _items.Add(Key, Item);
    }

    public int Count()
    {
        return _items.Count;
    }

    public System.Collections.IEnumerator GetEnumerator()
    {
        return _items.Values.GetEnumerator();
    }

    public dynamic Item(ref object Index)
    {
        return _items[Index];
    }

    public void Remove(ref object Index)
    {
        _items.Remove(Index);
    }
}
class MyCollection:VBA.\u Collection
{
专用词典_items=新词典();
public void Add(引用对象项,[System.Runtime.InteropServices.OptionalAttribute]引用对象键,[System.Runtime.InteropServices.OptionalAttribute]引用对象之前,[System.Runtime.InteropServices.OptionalAttribute]引用对象之后)
{
//为了简单起见,忽略Before和After参数
_项目。添加(键,项目);
}
公共整数计数()
{
返回_items.Count;
}
public System.Collections.IEnumerator GetEnumerator()
{
返回_items.Values.GetEnumerator();
}
公共动态项(参考对象索引)
{
返回项目[索引];
}
公共无效删除(参考对象索引)
{
_项目。删除(索引);
}
}

我已经将其改编为vb.net,并且必须修复add的键,因为它丢失时为null

我会在测试后编辑这篇文章。我需要确保当VB6调用.Net dll,将vba集合作为参数传递给它,并且.Net dll将另一个vba集合作为返回值传递回时,它可以工作。老兄,如果能成功的话,这会帮我省去很多麻烦

公共类VBA集合
实现VBA.\u集合
私有项作为新字典(对象的,对象的)
公共子添加(ByRef项作为对象,可选ByRef键作为对象=无,可选ByRef前作为对象=无,可选ByRef后作为对象=无)实现VBA。_Collection.Add
'为简单起见,忽略前后参数
Key=If(Key,Item)
_项。添加(键,项)
端接头
作为整数的公共函数Count()实现VBA.\u Collection.Count
Return\u items.Count
端函数
公共函数GetEnumerator()作为System.Collections.IEnumerator实现VBA。_Collection.GetEnumerator,System.Collections.IEnumerable.GetEnumerator
返回_items.Values.GetEnumerator()
端函数
作为对象实现VBA的公共函数项(ByRef索引为对象)。\u Collection.Item
返回项目(索引)
端函数
Public Sub Remove(ByRef索引为对象)实现VBA。\ u Collection.Remove
_项目。删除(索引)
端接头
末级
编辑:

不,这不适用于VB6。VB6说:

“类不支持自动化或不支持预期的 接口“


这里讨论的类是我的类,它使用VBA集合而不是VBA.Collection。VBA集合不是VBA.Collection的相同替代项。我想找出原因,并试图假装COM接受它。

该页面说“只有Visual Basic 6.0应用程序才能创建VBA.Collection类的实例”。你需要这些收藏品做什么?也许有另一种方法可以实现您想要实现的目标。我使用的是为VBA编写的DLL。需要管理的财产之一是什么收集类型你是男人!这是一种伤害!应更换Add()中的小更改键和项目参数(表示第一个是键),这很酷!如何将
Item
设置为默认属性,以便执行VBA.Collection(1)并取回第一个项目?@ArcherBird您应该将此作为一个新问题提问,以便能够正确讨论。