DLL的VBA.Collection(DLL for VBA.Collection)

2019-11-03 08:05发布

我需要使用一个VBA.Collection类,我需要在为了做到这一点,以注册COM组件。 我发现我的电脑上MSVBVM60.DLL文件,并成功注册在我的系统。 我创建一个类VBA.Collection的实例,但我得到在该行的代码的异常:

VBA.Collection collection = new VBA.Collection();

唯一的例外有如下描述:

System.Runtime.InteropServices.COMException了未处理
(从HRESULT异常:0x80040154的(REGDB_E_CLASSNOTREG))80040154未注册的类:HRESULT = -2147221164消息=检索COM类工厂具有CLSID部件{A4C4671C-499F-101B-BB78-00AA00383CBB}失败,由于下面的错误。 来源= mscorlib程序
错误码= -2147221164

我用的regedit.exe工具来搜索与{A4C4671C-499F-101B-BB78-00AA00383CBB}的CLSID组件,但一直没能找到一个。 我猜想,应该是我要注册另一个.dll文件,即使我可以在Visual Studio中,提及MSVBVM60.DLL对象浏览器中看到,我可以访问内它VBA命名空间和集合类。

它说,该网页上http://codeverge.com/asp.net.migrating-from-asp/using-vba.collection-object-in-net/577432 ,问题会自动消失,如果我实例VBA.CollectionClass 。 但是,如果我这样做,我收到以下错误,我的代码无法编译:

互操作型“VBA.CollectionClass”不能被嵌入。 使用适用的接口,而不是

我已经注册了错误的COM组件? 或者是有什么我需要在我的C#代码改变?

我也读上如何建立在C#中VBA.Collection()对象 ,我需要创建自己的基于VBA._Collection接口类,而不是实例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);
    }
}

我现在实例MyCollection的类MyCollection collection = new MyCollection(); 我没有得到一个异常那里了。 然而,我需要调用返回类型VBA.Collection的目的另一个COM组件的方法GetIncidentCodes()。 如果我使用collection = class1.GetIncidentCodes(); ,那么因为需要显式类型转换我的程序将无法编译。 如果我使用collection = (MyCollection) class1.GetIncidentCodes(); ,然后我得到以下异常:

无法投型“系统.__ ComObject”类类型“PoliceDispatcherClient.MyCollection”的COM对象。 的代表COM组件不能被转换为不表示COM组件的类型类型的实例; 然而,它们可被铸造,只要该基础COM组件支持的QueryInterface要求的接口的IID对对接。

我应该投的返回值GetIncidentCodes()到接口VBA._Collection ? 我是新来的.NET,所以我不知道该怎么做。

文章来源: DLL for VBA.Collection