用于VBA.Collection的DLL

时间:2014-09-12 20:30:29

标签: c# .net vba com com-interop

我需要使用VBA.Collection类,我需要注册一个COM组件才能做到这一点。我在我的电脑上找到了msvbvm60.dll文件并在我的系统中成功注册了该文件。我正在创建一个类VBA.Collection的实例,但我在该行代码中得到一个异常:

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

该例外有以下描述:

  

System.Runtime.InteropServices.COMException未处理
  HResult = -2147221164 Message =正在检索COM类工厂   CLSID {A4C4671C-499F-101B-BB78-00AA00383CBB}的组件未通过   出现以下错误:80040154未注册类(例外情况除外)   HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。来源= mscorlib程序
  错误码= -2147221164

我使用regedit.exe工具搜索CLSID为{A4C4671C-499F-101B-BB78-00AA00383CBB}的组件,但无法找到。我怀疑应该有另一个我应该注册的.dll文件,即使我可以在Visual Studio中使用对象浏览器看到引用msvbvm60.dll让我可以访问其中的VBA名称空间和Collection类。

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

  

Interop type' VBA.CollectionClass'无法嵌入。使用   适用的界面

我是否注册了错误的COM组件?或者我需要在C#代码中更改哪些内容?

我还在How to create VBA.Collection() object in c#上读到我需要基于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 collection = new MyCollection();实例化MyCollection类 我不再有例外了。但是,我需要调用另一个返回类型为VBA.Collection的对象的COM组件的GetIncidentCodes()方法。如果我使用collection = class1.GetIncidentCodes();,那么我的程序将无法编译,因为需要显式强制转换。如果我使用collection = (MyCollection) class1.GetIncidentCodes();,则会出现以下异常:

  

无法转换类型为&#39; System .__ ComObject&#39;的COM对象。到班级类型   &#39; PoliceDispatcherClient.MyCollection&#39 ;.类型的实例   表示COM组件不能转换为不表示的类型   COM组件;但是只要它们可以转换为接口   底层COM组件支持对IID的QueryInterface调用   界面。

我应该将GetIncidentCodes()的返回值转换为接口VBA._Collection吗?我是.NET的新手,所以我不知道该怎么做。

0 个答案:

没有答案